Hallo,
ich bin ziemlich neu in dem Thema und wollte eine 7 Segment anzeige dazu
bringen, von 0 hochzuzählen mit einer Pause von jeweils 1000ms zwischen
dem Wechsel.
Jedoch will ich keine Delay Funktion nutzen, sondern die Interrupts
nutzen.
Ich habe jetzt einen Code geschrieben, jedoch funktioniert dieser nicht.
Die Bitmasken sind aufjedenfall richtig. Beim ausführen sehe ich
garnichts, weshalb ich denke dass meine Interrupt Routine garnicht
aufgerufen wird.
Edit: Es handelt sich um einen AtMega328PB
Was soll das? Das zählt im ersten Interrupt einmal bis 100 und verweilt
dann da fröhlich. Wenn du die 10ms zählen willst um auf 1s zu kommen,
solltest du das anders machen.
Und du benutzt einen Capturewert und rufst den Overflowvector auf.
Jürgen V. schrieb:> Hallo,>> ich bin ziemlich neu in dem Thema und wollte eine 7 Segment anzeige dazu> bringen, von 0 hochzuzählen mit einer Pause von jeweils 1000ms zwischen> dem Wechsel.> Jedoch will ich keine Delay Funktion nutzen, sondern die Interrupts> nutzen.
Prnzipiell richtig.
> Ich habe jetzt einen Code geschrieben, jedoch funktioniert dieser nicht.
Das oft der Fall ;-)
> Die Bitmasken sind aufjedenfall richtig. Beim ausführen sehe ich> garnichts, weshalb ich denke dass meine Interrupt Routine garnicht> aufgerufen wird.
Du hast einige grundlegende Dinge beim Thema Interrupt noch nicht
verstanden. Lies den Artikel Interrput.
1
while(timer_counter<100){
2
3
timer_counter++;
4
5
}
Sowas ist sinnlos und hat in einer ISR nix zu suchen.
Das Multiplexen bzw. die Anzeige der Zahl macht man sinnvollerweise in
der ISR, den Rest außerhalb. Für das einfache Beispiel kann man aber
auch alles in der ISR machen. Siehe Anhang.
Dein wesentlicher Fehler ist der falsche Interrupt. Im CTC-Modus wird
der Overflow praktisch NIE ausgelöst. Bei CTC muss man den COMPA nutzen.
Hannes schrieb:> So ist es noch n ticken schöner, sofern die Anzeige asynchron umschalten> darf.
Sicher?
volatile uint8_t timer_counter = 0;
if(timer_counter == 10000) //nach 10s
Ich habe mir das Thema noch einmal neu angeschaut mit dem Interrupt und
gemerkt dass ich die Funktion nicht richtig verstanden habe.
Jetzt habe ich das Thema verstanden und meinen Code verbessert. Jetzt
klappt es auch mit dem hochzählen!
1
ISR(TIMER0_COMPA_vect)
2
{
3
4
if(timer_counter<100)
5
{
6
timer_counter++;
7
}
8
9
else
10
{
11
timer_counter=0;
12
13
number++;
14
15
if(number==10)
16
{
17
number=0;
18
}
19
}
20
21
PORTC=PC_Bitmaske[number];// 7 Segmentanzeige des Zählwerts (Ziffer)
22
PORTD=PD_Bitmaske[number];
23
24
25
}
als nächstes versuche ich mal ein numpad zu benutzen. wünscht mir glück
:D
Ich will nun den PB2 Pin von meinem Knopf auslesen um eine Nummer
anzeigen zu lassen. Wie lasse ich den Zustand von einem Pin abfragen.
Ich habe einmal das unten und einmal mit PINB versucht aber beide male
wird auch ohne den gedrückten Knopf die 1 angezeigt.
if(PORTB & (1<<3)){
number = 1;
}
Ja, ein PORT wird auch nicht als PORT ausgelesen, sondern als PIN,
PIN ist der input buffer,
PORT ist der output buffer.
if ((PINB & 0x02)==0x02) {.. mach ..}