Forum: Mikrocontroller und Digitale Elektronik Interrupt -> Problem beim Hochzählen


von Andreas Sch. (Gast)


Lesenswert?

Hallo Allerseits

Ich habe einen ATMEGA8 mit 8MHz Atmelstudio 6 und folgendes Problem,
normalerweise solte sich bei im Vergleich zu BP0 bei PB1 nichts ausser 
der Frequenz ändern.
Aber wenn ich "Presc_250ms >= 250" verwende ist PB1 low und wenn ich
"Presc_250ms >= 10" verwende wird PB1 getoggelt (PB0 wird sichtbar immer 
von der ISR getoggelt)
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <util/atomic.h>
4
#include <stdint.h>
5
6
#define Tog_Char(Byte,Bit)          Byte ^= (1<<Bit)  //Toggeld Charbit
7
#define Set_Char(Byte,Bit)          Byte |= (1<<Bit)  //Bit setzen
8
#define Clr_Char(Byte,Bit)          Byte &= ~(1<<Bit)  //Bit löschen
9
#define Cpy_Char(Byte1,Bit1,Byte2,Bit2)    if(Byte1 & (1 << Bit1)) Byte2 |= (1 << Bit2); else Byte2 &= ~(1 << Bit2);
10
11
//Prescaler-Variablen (Pointer)
12
volatile uint8_t  Presc_250ms = 0;
13
14
ISR (TIMER0_OVF_vect)
15
{
16
  /* Interrupt Aktion alle
17
  (8000000/8)/256 Hz = 488,28125 Hz
18
  bzw.
19
  1/488,28125 s = 2,048 ms
20
  */
21
  TCNT0 = 124;
22
23
  Tog_Char (PORTB,PB0);
24
  Presc_250ms++;
25
  if (Presc_250ms >= 250)
26
  {
27
    Tog_Char (PORTB,PB1);
28
    Presc_250ms = 0;
29
  }
30
31
32
}
33
34
35
int main(void)
36
{
37
  ATOMIC_BLOCK(ATOMIC_FORCEON)
38
  {
39
    // Timer 0 konfigurieren
40
    TCCR0 |= /**(1<<CS00) | (1<<CS01) | **/ (1<<CS02); // Prescaler 256
41
42
    // Overflow Interrupt erlauben
43
    TIMSK |= (1<<TOIE0);
44
     
45
    DDRB |= (1<<PB0) | (1<<PB1);
46
47
    
48
  }
49
  // Global Interrupts aktivieren
50
  sei();
51
52
  while(1)
53
  {
54
    /* Sonstige Aktionen */
55
    //Cpy_Char(m0,5,PORTB,PB0);
56
    //Set_Char(PORTB,PB0);
57
    //Tog_Char (PORTB,PB0);
58
  }
59
}

Kann mir bitte Jemand helfen dieses simple Blink-LED-Projekt zum laufen 
zu bringen?

von Karl H. (kbuchegg)


Lesenswert?

> PB0 wird sichtbar immer von der ISR getoggelt)

Da stimmt was mit deinen Takteinstellungen nicht.
Eine 2ms getoggelte LED siehst du mit freiem Auge mit Sicherheit nicht 
mehr toggeln.


Wahrscheinlich läuft dein Mega nicht mit 8Mhz sondern nur mit 1Mhz. 
Wodurch sich alle von dir errechneten Zeiten ver-8-fachen. D.h. du hast 
nur nicht lange genug gewartet um das Blinken bei "250ms" zu sehen.

von Andreas Sch. (Gast)


Lesenswert?

Ich sehe dass die LED (wenn sie die halbe Zeit an und die halbe Zeit aus 
ist) halb leuchtet und kann bei verbinden auf ein Piezolautsprecher ein 
brummen hören, der Takt passt warscheinlich schon

von Karl H. (kbuchegg)


Lesenswert?

Andreas Sch. schrieb:
> Ich sehe dass die LED (wenn sie die halbe Zeit an und die halbe Zeit aus
> ist) halb leuchtet

ok.
Gedimmt kannst du sie natürlich schon sehen.
Dann habe ich die Aussage einfach nur missverstanden

ok.
Also bei 10 siehst du PB1 toggeln. Wie schnell ungefähr? Deckt sich das 
was du siehst, mit dem was du an Toggle-Frequenz ausrechnest?

Geh halt mal Schritt für Schritt höher.
10, 30, 50, 70, ....

Das Blinken das du siehst wird immer langsamer werden. Nimm dir eine 
Blinkfrequenz, die du in etwa abschätzen kannst (zb auszählen über 10 
Sekunden) und dann rechne mal zurück.

> brummen hören, der Takt passt warscheinlich schon

Darauf würde ich immer noch nicht wetten :-)

von Andreas Sch. (Gast)


Lesenswert?

So grob geschätzt dürfte es bei >=10 nahe einer sichtbaren frequenz 
liegen, da man es bei der LED gerade noch sieht. schätze so 65Hz 
aufwerts. Am Piezolautsprecher ist es wesentlich tiefer vom Ton her als 
PB0.

Sobald ich 11 oder hoher reinschreibe leuchtet nix mehr. Das es abrupt 
bei Eingeben ab größer 10 aufhört zu leuchten verstehe ich überhaupt 
nicht

von Karl H. (kbuchegg)


Lesenswert?

Andreas Sch. schrieb:

> Sobald ich 11 oder hoher reinschreibe leuchtet nix mehr. Das es abrupt
> bei Eingeben ab größer 10 aufhört zu leuchten verstehe ich überhaupt
> nicht

Ist mit dem Programm auch nicht zu erklären :-(

Du hast nicht zufällig in den Fuses den Watchdog aktiviert?
Der könnte das wiederrum erklären.

von Andreas Sch. (Gast)


Lesenswert?

den watchdog? Hmmm das muss ich mir mal ansehen
Danke erst mal, meld mich sobald ich mehr weiss

von Andreas Sch. (Gast)


Lesenswert?

Wow, tatsächlich, ich weis zwar nicht wann ich dass gemacht haben soll 
aber der war in den highfuses aktiviert

Jetzt klappt es, vielen vielen Dank :)

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.