Kann mir denn echt keiner helfen??Ich erwarte hier keinen ganzen code sondern nur das mir jemadns agen kann wo der fehler liegt!.
Hallo,
Kann mir jemand sagen wo der Fehler im Code liegt?Anstatt zu blinken leuchtet LED.
Code:#include <avr/io.h> int main() { TCCR1B = (1<<CS11)|(1<<CS10); TIMSK = (1<<TOIE1); while(1) { if (TIFR = (1<<TOV1) ) { DDRD |= (1<<PD6); /*Ausgang*/ PORTD |= (1<<PD6);/*Pull up an*/ PIND |= (1<<PD6); /*High*/ } else { DDRD &= ~(1<<PD6); /*Ausgang*/ PORTD &= ~(1<<PD6);/*Pull up an*/ PIND &= ~(1<<PD6); /*High*/ } } }
Kann mir denn echt keiner helfen??Ich erwarte hier keinen ganzen code sondern nur das mir jemadns agen kann wo der fehler liegt!.
Hallo
Das geht so nicht
if (TIFR = (1<<TOV1) )
Sollte so aussehen
#include <avr/io.h>
...
/* Fuehre Aktion aus, wenn Bit Nr. 1 (das "zweite" Bit) in PINC gesetzt (1) ist */
if ( PINC & (1<<PINC1) ) {
/* Aktion */
}
Siehe dazu auch
http://www.mikrocontroller.net/artic...immten_Zustand
und
http://www.mikrocontroller.net/artic...immten_Zustand
MFG
Dieter
Vielen dank für deine antwort funktioniert zwar noch immer nicht aber wenigstens schonmal ein fehler weniger!
wieso schaltest du ständig zwischen Ausgang und Eingang um und machst den Pull-Up an und wieder aus? Das sollte 1x zu setzen sein und dann ist gut -- du brauchst doch nur noch den Pegel ändern durch an- und ausschalten vom PIN.
Mach mal deine Initialisierung global und schraub nicht ständig an allen Parametern gleichzeitig rum.
Wie man Fragen richtig stellt:
http://www.lugbz.org/documents/smart-questions_de.html
Das liegt daran, daß du keine ISR (Interupt Serice Routine) für den Timer1Overflow implementiert hast. Wenn dann ein Interrupt (IRQ) auftaucht, landest du im Reset und fängt wieder alles von vorne an.Zitat von Crocodile
Du musst dich entscheiden, ob du mit Timer1 Overflow Interrupt arbeiten willst oder nicht.
Code mit Interrupt:
Code ohne Interrupts:Code://Code mit Interrupt #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> int main() { // PORTD.6 ist Ausgang DDRD |= (1<<PD6); // PORTD.6 ist HIGH PORTD |= (1<<PD6); // Timer1 zurücksetzen TCNT1 = 0; // TOV1-Flag löschen TIFR = (1<<TOV1); // Timer1 starten in Mode ??? TCCR1B = (1<<CS11)|(1<<CS10); // Aktiviert Timer1 Overflow IRQ TIMSK = (1<<TOIE1); // Interrupts aktivieren sei(); while (1) { // Interrupt macht den Rest } } // Implementierung der ISR für Timer1 Overflow SIGNAL(SIG_OVERFLOW1) { // PORTD.6 Toggeln PORTD ^= (1<<PD6); // TOV1-Flag wird durch die IRQ automatisch gelöscht }
Code:// Code ohne Interrupts #include <avr/io.h> int main() { // PORTD.6 ist Ausgang DDRD |= (1<<PD6); // PORTD.6 ist HIGH PORTD |= (1<<PD6); // Timer1 zurücksetzen TCNT1 = 0; // Timer1 starten in Mode ??? TCCR1B = (1<<CS11)|(1<<CS10); while (1) { // TOV1-Flag löschen TIFR = (1<<TOV1); // Warten bis Flag auf 1 while (!(TIFR & (1<<TOV1)) { } // PORTD.6 Toggeln PORTD ^= (1<<PD6); } }
Disclaimer: none. Sue me.
Ich hab deinen Code grad ausprobiert und Fehler oder so, bekomm ich auch nciht, aber kann es sein, dass das blinken einfach immer noch viel zu schnell ist und auf uns wie ein durchgehenes an-sein wirkt? Weil meine 8Mhz durch 1024 sind doch so ungefähr 8khz und diese dann durch 256 sind auf jeden fall immer noch mehr als die fürs menschliche Auge sichtbaren 26 Herz.
Also falls ich jetzt Mist erzählt habe, sagts mir, aber so verstehe ich das.
www.subms.de
Aktuell: Flaschcraft Funkboard - Informationssammlung
Das mit der Frequenz stimmt natürlich.
CS1:2-0 = 011 gibt einen prescale von 64, bei 8MHz macht das eone Overflow1-Frequenz von knapp 2Hz, also müsste die LED mit 1Hz blinken.
Der Code, wie er oben steht, funktioniert definitv nicht, alleine schon
Ist ein semantisches Leckerli, wo man ins schwitzen kommt (TIFR ist volatile!).if (TIFR = (1<<TOV1))
Diese Bedingung ist immer erfüllt, denn (1<<TOV1) ist ungleich 0, abwohl man etwas anderes erwarten würde.
Also passiert in der Schleife nicht wirklich was spannendes. Selbst wenn das Konstrukt funzen würde, lefert es nicht das angedachte.
Disclaimer: none. Sue me.
[quote="SprinterSB"]
CS1:2-0 = 011 gibt einen prescale von 64, bei 8MHz macht das eone Overflow1-Frequenz von knapp 2Hz, also müsste die LED mit 1Hz blinken.
[quote]
Hä??? Sorry, aber könntest du das nochmal etwas genauer erklären? Weil ich les hier auch grad das AVR-GCC Tutorial und versuche nebenbei im Datenblatt vom meinem mega16 was zu verstehen.
Also es blinkt bei mir schon, mit der von dir angegeben Frequenz aber ich versteh noch nciht ganz warum.
Wenn ich 8Mhz hab und jetzt als Vorteiler 64. Dann komm ich doch auf *rechne* 125Khz. (oder hab cih da schon einen Fehler?). Und wenn da jetzt nur jedes 256. mal getoggelt wird, so ergibt dass nach meiner rechnung immer noch ne Frequenz von 488Hz.
Sorry, aber das versteh ich ncoh nciht.
Nachtrag:
Achsoo . .. . es ist doch ein 16Bit Timer, ne? Also mit ~65000 Zähler . .. Dann passts ja ....![]()
www.subms.de
Aktuell: Flaschcraft Funkboard - Informationssammlung
Ich danke euch allen für euer bemühen hab es gelöst bekommen.Ich sollte mir mal angewöhnen tutorialsbis zum ende zu lesen.Hier der Code.
Code:/* Timer0 8-Bit Vorteil = 1024 mit 1Mhz */ #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <avr/iom32.h> #include <avr/delay.h> volatile int counter; int main() { DDRD |= (1<<PD6); /*Ausgang*/ TCCR0 = (1<<CS00)|(1<<CS02);/*CPU-Takt / 1024*/ TIMSK = (1<<TOIE0); /* Timer0 Overflow Interrupt enable*/ TCNT0 = 0; /*Timer auf o setzen*/ sei(); /* Global Enable Interrupt Flag setzen */ while(1) { if (counter == 1) { PORTD |= (1<<PD6);/*Pull up an*/ PIND |= (1<<PD6); /*High*/ _delay_ms(100); counter = 0; } if (counter == 0) { PORTD &= ~(1<<PD6);/*Pull up an*/ PIND &= ~(1<<PD6); /*High*/ } } } SIGNAL (SIG_OVERFLOW0) /*Interrupt-Routine*/ { counter++; /*um eins inkrementieren*/ }
Lesezeichen