Forum: Mikrocontroller und Digitale Elektronik Timer Stop/Pause und wieder starten


von Andy C. (andyjiang)


Lesenswert?

Hallo, ich bin neu hier.   ich habe Probleme mit Timer, vielleicht 
könnte mir helfen. ich mache jetzt mit Atmega238 einen Schrittzähler. 
das programm funktioniert und möchte ich zusatzfunktionen zufügen, und 
zwar über HTerm.exe  wenn ich "S" eingebe, wird es anhalten/pause, "G" 
wieder starten  "R"  Reset.

ich habe so gemacht.
// Stop
void stop(void)
{

 TCCR1B=0;

}


//Go
void go(void)
{


init_Timer1();
start_Timer1();
init_ADC();
start_ADC();

}

// initialize timer1  **
void init_Timer1(void)
{

TCNT1 = 0;
        TCCR1A &= ~((1<< WGM11) | (1<< WGM10));
  TCCR1B &= ~((1 << WGM13 )|(1<< WGM12) | (1 << CS12) );
}

// start timer1 **
void start_Timer1(void)
{
TCCR1B |= ((1<<CS11)| (1<<CS10));
TIMSK1 |= (1 << TOIE1);
}

void init_ADC(void)
{

ADCSRA |= ((1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0));      //Prescaler at 128 so 
we have an 125Khz clock source
  ADMUX |= (1<<REFS0);
  ADMUX &= ~(1<<REFS1);                        //Avcc(+5v) as voltage 
reference
  ADCSRB &= ~((1<<ADTS2)|(1<<ADTS1)|(1<<ADTS0)|(1<<ADIE));    //ADC in 
free-running mode
  ADCSRA |= (1<<ADATE);                        //Signal source, in this 
case is the free-running
  ADCSRA |= (1<<ADEN);//Power up the ADC
}

// start ADC
void start_ADC(void)
{

ADCSRA |= (1<<ADSC);                        //Start converting

}


Stop funktioniert, aber wieder starten und reset funktionieren nicht.

von Transistorrrr (Gast)


Lesenswert?

Du solltest dir grundlegendes Wissen zu Timern aneignen. Lies im 
Datenblatt nach, welche Bedeutung die Register haben. Mach dir den 
Unterschied zwischen |= und &= ~ klar. Das gepostete Stückchen Code ist 
ziemlich kacke.

von Transistorrrr (Gast)


Lesenswert?

Transistorrrr schrieb:
> Du solltest dir grundliegendes Wissen zu Timern aneignen. Lies im
> Datenblatt nach, welche Bedeutung die Register haben. Mach dir den
> Unterschied zwischen |= und &= ~ klar. Das gepostete Stückchen Code ist
> ziemlich kacke.

von Thomas E. (thomase)


Lesenswert?

Andy C. schrieb:
> TCCR1A &= ~((1<< WGM11) | (1<< WGM10));
>   TCCR1B &= ~((1 << WGM13 )|(1<< WGM12) | (1 << CS12) );
Die Register sind nach Reset ohnehin 0. Das kannst du dir sparen.
Mit "Init" hat sowas nichts zu tun.

Jetzt guckst du dir im Datenblatt die Beschreibung für TCCR1B an.
Und zwar die Tabelle für die CS-Bits. Wenn die alle auf 0 stehen, steht 
der Timer. Um ihn dann wieder zu starten, setzt du einfach die 
entsprechenden CS-Bits. VORHER setzt du TCNT1 auf 0, um einen 
definierten Startpunkt zu erhalten.

mfg.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.