Hallo,
ich habe einen einfachen Timer geschrieben und ihn als mein zweites
Projekt (das erste war PORT-Abschalten) nicht in Sisy-Avr sondern in
AVR-Studio mit C-Unterstützung compiliert.
Jetzt will der Controller nicht mehr!
Wenn ich ihn anschließe (JA, RESET auf Plus und Spannung stabilisiert!)
und an PORTB0 und PORTB1 Leds mit 1kOhm Vorwiederstand hänge, dann gehen
die
Leds mal einzaln, mal zusammen an.
Habt ihr eine Ahnung?
Hier der Code:
Ähm... wie bitte willst du sehen ob die LEDs ein paar Mikrosekunden an
sind ?
Du schaltest zwei davon in der main() immer aus.. selbst wenn sie im
Intrrupt angemacht werden, danach werden sie in main sofort wieder
ausgeschaltet :-)
Ausserdem sollte "set" volatile sein.
> Jetzt will der Controller nicht mehr!
So ein kurzes Programm könntest du im AVR-Studio auch einfach mal
simulieren...
> dann gehen die Leds mal einzaln, mal zusammen an.
Abhängig von was?
>Achso, hätte ich fast vergessen,>die Fuses sind auf 128khz Oszi-Frequenz eingestellt!
Das ändert nix.
Ich habe Deine Frage beantwortet und dir den Grund, warum das Programm
nicht das macht du willst, genannt.
ich habe nichts repariert, sondern nur kommentiert, was ich ändern
würde. Insbesonders das volatile. Leider weiss ich nicht, ob der Timer
sich selbst nach Ablauf startet bzw. durchläuft, oder ob man das zu Fuss
machen muss, in diesem Falle hat der Programmierer noch was vor sich.
Den Rest bitte den Kommentaren entnehmen.
Robert
Bohh.. leute..
in main ist ein schleife die portb auf 1 setzt.
immer wieder.
mag zwar sein, daß man bei nur 128 khz ein gaaanz kurzes blitzen der
anderen led sehen könnte, aber so ist das vermutlich nicht gedacht
blind ??
Ohhh, das habe ich garnicht gesehen!!!!
Gut.
Also muss ich da den Port mit einer Oder-Verknüpfung beschreiben!
Was für Togglebefehle? Die gibts in Sisy-C nicht!
Und wie geht das Simulieren?
Valentin
PS: Danke für die Antworten!
Ohhh, also per NOT oder XOR! Das heißt in GCC also "!"!
Danke
Kann ich die Schleife einfach leer lassen? Oder kürzt der die dann weg?
Und wie geht das mit dem Simulator?
Valentin
PS: Hier der Code:
Dein Programm ist mitlerweile ein heftiges Sammelsurium an
Sschreibweisen. Nur die eine, die du eigentlich benutzen solltest, die
ist nicht dabei :-)
Das ändert aber immer noch nichts daran, dass dein Timer zu schnell
läuft. So kannst du die Overflows noch weiter runterteilen.
1
#include<avr\io.h>
2
#include<avr\interrupt.h>
3
4
unsignedcharcounter;
5
6
ISR(TIM0_OVF_vect)
7
{
8
counter++;
9
10
if(counter==7)// ergbit bei 1Mhz ca. 0.5 Sekunden bei Presc. 256
Mal abgesehen von all dem Gesagten: das ist sehr schlechter Stil:
1
>TIMSK0|=_BV(0);// Interrupt bei Überlauf
und überdies falsch. Bit 0 in TIMSK0 gips beim Tiny13 nicht. Das wäre
nicht passiert, wenn Du gleich
1
TIMSK0|=(1<<TOIE0);
geschrieben hättest, wie es sauberer Programmierstil erfordert hätte.
Der ist nämlich nicht dazu da, fremde Schönheitsideale zu befriedigen,
sondern sehr nützlich, um sich selbst vor diesem und vielen anderen
solchen Fehlern zu bewahren.
Aus langer Erfahrung: So wie ein Programm aussieht, ist es meistens
auch. In Deinem Fall sieht schon der kurze Schnipsel so aus, als wäre
es nicht der Tiny13, der am völligen Durchdrehen ist.
So, ich habe eure Tipps mal umgesetzt. Ich benutze aber den internen
Takt auf 128Khz mit Vorteiler 256 und dann wird das Ganze noch durch 255
geteilt, bis es zum Overflow kommt. Das gibt meiner Rechnung nach gerade
mal 1,9 Hz.
Deshalb habe ich den Teiler weggelassen. Hier mein endgültiges Programm:
Jetzt wollte ich mein Programm mal auf einen ATMEGA32 transferieren, und
dabei nur bis 250 zählen. Ich verwende aber wieder Timer0.
Allerdings meint AVR Studio nun, dass TCCR0 kein COM0-Bit hat.
Hier der Code:
1
...
2
ISR(TIMER0_COMPA_vect){
3
PORTB=PORTB^((1<<PB0)|(1<<PB1));
4
}
5
...
6
TCCR0=(1<<CS02)|(1<<COM0);// Teiler 1/256, Modus: Zählen bis //Vergleichswert
"The double buffered Output Compare Register (OCR0) is compared with the
Timer/Counter value at all times."
OK, der vergleicht es also dauernd.
Valentin