attiny85 & TCCR1 Pin 1 wieder freigeben

Hallo Freunde,
Ich habe hier ein Sketch der eine amerikanische Polizeisirene inkl. Horn und Hupe über nen Lautsprecher ausgibt. Diese Arbeitet mit dem TCCR1 Register. Der Sound wird über D1 (Pin6 des Attiny85) ausgegeben.

Nun zum Problem: Sobald TCCR1 einmal aktiviert ist, bleibt D1 im Ruhezustand dauernd auf High, was einen hohen Gleichstrom über den Lautsprecher schickt und diesen innert recht kurzer zeit durchbrennen lässt.

Ich habe im internet gelesen, dass man die Bindung vom Timer zum Pin 1 speziel lösen muss, damit man den P1 wieder z.b mit digitalWrite(1, 0) abschalten kann.
Nur komme ich einfach nicht dahinter, welchen Wert ich dazu wie ins TCCR1 Register, oder wohin auch immer. schreiben muss, um den Pin frei zu geben.

Hier der Sketch, nicht alles von mir.

/*
  Created by: Electronic Projects
  Youtube channel: https://www.youtube.com/channel/UCAE_BN64jkkjfGJLSs21upg
  Date: Jan-03-18
  Modified by SMC @Desitron for Attiny85/8MHz internal - Siren only & Horn & Hupe
  Date: May-20-18

  Module Pinout:
  Reset     O-    -O  VCC
  D3        O-    -O  D2/
  D4        O-    -O  LowOut D1
  GND GND   O-    -O  D0

 Siren Control over digitalRead on Input  (pin7,D2) LSB + (Pin2, D3) MSB
 Siren off = Value 0 : Siren on = value 1 : Horn = value 3 ; Hupe = Value 2
*/

#define Speaker 1
#define SNDbit0 2
#define SNDbit1 3


unsigned int i, j;
const int Ton_Die = 525, Ton_Low = 410, Ton_High = 350, Ton1_Hupe = 507, Ton2_Hupe = 508, t1 = 7, t2 = 500;  // for timerfree_tone  t1 = delay in milliseconds, t2 = delay in microseconds



void setup() {

  randomSeed(analogRead(2));

  pinMode(Speaker, OUTPUT);
  pinMode(SNDbit0 , INPUT_PULLUP);
  pinMode(SNDbit1 , INPUT_PULLUP);
}


void loop() {
  
     
     if (Sound() > 0){
       switch(Sound()){
        case 1 :
          Sirene();
          break;
        case 2 :
          Hupe();
          break;         
        case 3 :
          Horn();
          break;
       }
     }     
     else
     {
     digitalWrite(Speaker, 0);
     }
    }


byte Sound()
     {
     boolean LSB = digitalRead(SNDbit0);
     boolean MSB = digitalRead(SNDbit1);     
     return LSB + MSB + MSB;    
     }
     
     
void TinyTone(unsigned char divisor, unsigned char octave, unsigned long duration)
{
  TCCR1 = 0x90 | (8 - octave);
  OCR1C = divisor - 1; // OCR1C
  delay(duration);
  TCCR1 = 0x90;
}


void Hupe(void){
  while (Sound() == 2) 
  {
    TinyTone(Ton1_Hupe, 2, 2);
    //TinyTone(Ton1_Hupe, 5, 2);
  }
  while (Sound() > 0);    // solange an den controll eingängen ein wert > 0 anliegt
}



void Horn(void) {
  while (Sound() == 3) {
    for (i = Ton_Low; i >= Ton_High; i -= 3) {
      TinyTone(i, 2, 25);
    }
    //  TinyTone(i, 2, 1350);
    for (i = Ton_High; i <= Ton_Low; i += 2 ) {
      TinyTone(i, 2, 14);
    }
    delay(444);
    while (Sound() == 3) {
      for (i = Ton_Low; i >= Ton_High; i -= 4) {
        TinyTone(i, 2, 20);
      }
      for (i = Ton_High; i <= Ton_Low; i += 6 ) {
        TinyTone(i, 2, 10);
      }
    }
  }
  while (Sound() == true);    // warten bis Wert unten ist 
}

void Sirene(void) 
  {
    sound1();
    if (Sound() == 0) return;
    sound2();
    if (Sound() == 0) return;
    sound1();
    if (Sound() == 0) return;
    sound2();
    if (Sound() == 0) return;
    sound2();
  }

void sound1(void) {
  int SLoop = random(2, 5);
  for (j = 1; j <= SLoop; j++) {
    for (i = Ton_Low; i >= Ton_High; i -= 2) {
      TinyTone(i, 2, 68);
    }
    TinyTone(i, 2, 1150);
    for (i = Ton_High; i <= Ton_Low; i += 2) {
      TinyTone(i, 2, 63);
    }
    if (Sound() == false){
      //TinyTone(i, 2, 610);
      for (i = Ton_Low; i <= Ton_Die; i+=3) {
        TinyTone(i, 2, 55);
      }
      TinyTone(Ton_Die, 2, 800);
      break;
    }
    else
    {
      TinyTone(i, 2, 1010);
    }
  }
}

void sound2(void) {
  int SLoop = random(15, 25);
  for (j = 1; j <= SLoop; j++) {
    for (i = Ton_Low; i >= Ton_High; i -= 4) {
      TinyTone(i, 2, 10);
    }
    for (i = Ton_High; i <= Ton_Low; i += 4 ) {
      TinyTone(i, 2, 10);
    }
    if (Sound() == false) break;
  }
}

Danke für eure geschatzte Hilfe.
Stefan

Datenblatt
Seite 86

Dankeschön combie. Funktioniert wenn ich [/code]TCCR1 = 0x80[/code] setze.
Es funktioniert jedoch NUR wenn ich dies direkt am Ende im void TinyTone anstelle von TCCR1 = 0x90 tue.
Wenn ich den Befehl z.B im loop vor dem Befehl digitalWrite (Speaker , 0); absetze, hat digitalWrite wieterhin keine auswirkung und der Ausgang bleibt high.

Weiss jemand, warum das so ist ?

Danke für eure Antwort.

Stefan

Hallo,

zeige doch nochmal den gesamten Sketch ohne Hexcode für die Register. Kann nämlich sonst niemand vernünftig lesen.

digitalWrite (Speaker , 0);

Macht das einen Unterschied, wenn du statt der Null ein low setzt?

Die Deklaration der Funktion:
void digitalWrite(uint8_t pin, uint8_t val);

Die Definition von low:
#define LOW 0x0

Macht das einen Unterschied, wenn du statt der Null ein low setzt?

Nein, da low per Definition eine Null ist.

@Doc_Arduino,
Wie meinst Du, ohne den Hexcode für die register?
Der ganze code ist ja oben eingefügt.
Die stellen mit dem Hexcode sind so im Originalsketch drin.
ich hab dann lediglich anhand des Datenblattes, auf das mich combie hingewiesen hat, dem TCCR1-Register den Wert ubergeben, der das Bit, das für die Verknüpfung zum Pin1 Zuständig ist auf Null gesetzt. Dabei habe ich alle andern Bits so belassen, wie sie waren.

LG Stefan