Hallo
Ich versuche den 8 bit timer des atmega 64 zum laufen zu bekommen, doch
ich kann machen was ich möchte es klappt einfach nicht.
ich habe eine extra initialisierungs funktion für den timer geschrieben.
void timer0Init(void)
{
//initialisiert Interrupt bit im statusregister
SREG |= 0x80;
//timerinterrupt aktivieren
TIMSK |= (1<<OCIE0);
//CTC Mode Prescaler 256
TCCR0 |= (1<<WGM01) | (1<<CS01) | (1<<CS02);
//vergleichswert
OCR0 = 0xFF;
}
jedes mal wenn der timer überläuft soll über den uart etwas
rausgeschrieben werden. (uart funktion funktioniert habe ich getestet)
ISR(SIG_OUTPUT_COMPARE0)
{
usartPuts("test\r\n");
}
die initialisierungs funktion wird aufgerufen.
avr/signal.h u. interrupt.h werden eingebunden.
Gizmo wrote:
> ich habe im sreg das I bit per SREG |= 0x80; gesetzt was ist der> unterschied zu sei(); ?
2 CPU-Takte.
Dein Code ist reichlich altmodisch. SIGNAL, Vektornamen mit SIG_
und <avr/signal.h> sind schon einige Jahre lang "deprecated".
UART-Ausgaben in einer ISR sind auch nicht das Gelbe. Bei 9600 Bd
würde diese Ausgabe stolze 6 ms dauern. Wenn F_CPU = 1 MHz ist,
dann würde sich die Katze etwa bei einem OCR0 von 23 in den Schwanz
beißen, weil die UART-Ausgaben länger dauern als das CTC-Intervall.
Aber einen wirklichen Fehler finde ich da nicht, und ich verwette
meine (nicht vorhandene :) Perücke, dass der Code funktionieren
würde, wenn ich ihn bei mir auf einem ATmega128 (praktisch baugleich
bis auf die Speichergrößen) implementiere.
Ach, *klick*: hast du die M103C-Fuse abgeschaltet?
Hallo
Jörg danke für deine Antwort mein atmega 64 läuft mit internem
oszillator auf 8 Mhz das calibration byte ist geschrieben.
was ist denn das M103C-Fuse ? hab das noch nie gehört.
hi jörg
wenn ich den von dir genannten interrupt vektor verwende bekomme ich
folgendes warning.
: warning: 'TIMER1_COMP_vect' appears to be a misspelled signal handler
Gizmo wrote:
> hi jörg>> wenn ich den von dir genannten interrupt vektor verwende bekomme ich> folgendes warning.> : warning: 'TIMER1_COMP_vect' appears to be a misspelled signal handler
wie wäre es dann jetzt mal mit einem Blick ins Datenblatt??
Gizmo wrote:
> wenn ich den von dir genannten interrupt vektor verwende bekomme ich> folgendes warning.Den habe ich nicht vorgeschlagen...
Aber der Vektorname ist ein Schönheitsfehler, nicht dein eigentliches
Problem. Das wird wohl nach wie vor die M103C-Fuse sein.
hab das flag vor meinem letzten post schon rauß genommen.
ich prüfe gerade das überlaufs flag im TIFR register um sicherzustellen
ob der timer überhaupt läuft.
das steht gerade als erstes in meiner (while(1)) programmschleife.
if(TIFR & 0x04)
{
usartPuts("tov1\r\n");
}
so wie es aussieht wird das überlaufsflag nie gesetzt da auf
hyperterminal nichts erscheint.
sprich der timer läuft garnicht erst an.
heul
Nochmal:
Solange du die M103 Fuse nicht korrekt einstellst, stürzt dein µC beim
ersten Funktionsaufruf ab.
Solange diese Fuse nicht korrekt steht (und bei einem nagelneuen M128
steht sie falsch!) ist es sinnlos, sich über andere Fehler Gedanken zu
machen.
Gizmo wrote:
> sprich der timer läuft garnicht erst an.>> *heul*
laut deinem ersten Post startest du Timer0, jetzt prüfst du plötzlich
Timer1...
was red ich, du ignorierst ja eh alles...
@ Justus Skorps
kannst du eigentlich auch mal was schreiben was einem weiterhilft ?
na ja, warscheinlich nicht da du offensichtlich nicht viel ahnung hast,
leute die wissen von was sie reden wie alle anderen die mir hier helfen
wollen schreiben nicht so einen nonsen wie du. Das kannst du dir echt
sparen.
Ein Tip an dich: Wenn du gerne was tippen möchtest schreib ein Tagebuch.
Bin halt Einsteiger und irgendwann weiß man halt nicht mehr weiter.
zum datenblatt: glaubst da hab ich noch net rein geschaut.
es kann sein das man beim lesen was übersieht, dann fragt man halt wenn
was nicht klappt. wozu ist ein forum bitte schön da ?
ich wünsche dir noch nen schönen tag
servus
Gizmo wrote:
> @ Justus Skorps>> kannst du eigentlich auch mal was schreiben was einem weiterhilft ?
du meinst sowas
>http://www.mikrocontroller.net/articles/AVR_Fuses#Kompatibilit.C3.A4tsfuses_und_manchmal_l.C3.A4stige_Defaults
oder
> laut deinem ersten Post startest du Timer0, jetzt prüfst du plötzlich> Timer1...
?
> na ja, warscheinlich nicht da du offensichtlich nicht viel ahnung hast,
wie soll man aus deinen hingeworfenen Code-Fetzen denn Ahnung bekommen?
> leute die wissen von was sie reden wie alle anderen die mir hier helfen> wollen
denen du auch nicht antwortest, und darauf hab ich mich bezogen...siehe
Frage nach M103C-Fuse...
> glaubst da hab ich noch net rein geschaut.
anscheinend nicht, sonst wäre
> was ist denn das M103C-Fuse ? hab das noch nie gehört.
nicht gekommen...
Gizmo wrote:
> kannst du eigentlich auch mal was schreiben was einem weiterhilft ?> na ja, warscheinlich nicht da du offensichtlich nicht viel ahnung hast,> leute die wissen von was sie reden wie alle anderen die mir hier helfen> wollen schreiben nicht so einen nonsen wie du. Das kannst du dir echt> sparen.
Nun werd' hier mal nicht pampig, sonst redet ganz schnell keiner
mehr mit dir. Er hat doch mit seiner Frage völlig Recht: du hast
anfangs immer von Timer 0 geschrieben, jetzt prüfst du den Überlauf
von Timer 1 (und noch dazu mit 0x04 statt _BV(TOV1), bei dem man
wenigstens gleich erkennen würde, wofür das Flag gut ist).
Wenn du den Timer im CTC-Modus betreibst, wird er außerdem nie
überlaufen, da er ja vorher zurück gesetzt wird. Daher benutzt
du ja auch die ISR für compare match statt der für overflow.
Am besten, du postest mal einen kompletten, compilierbaren Code, und
zwar den, den du auch zum Testen benutzt. (Bitte als Anhang.)
Oliver wrote:
>>Na denn, zum Testen ob der Timer überhaupt anläuft,>> Nö. Dafür braucht er dafür schon sowas:
Hast recht. Könnte ja auch noch ein Fehler beim Flashen sein.
Aber den PORTA noch auf Ausgang setzen.
Eine eigene Frage?
Dieser Thread ist über 17 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.