Interrupt -> Problem beim Hochzählen

Gast #2963558
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?
#2963587
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.
#2963612
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 :-)
Gast #2963631
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.