Nun bin ich doch etwas in Sorge. Meine Assemblerroutine am tiny13 für den externen Interrupt läuft auch nicht. Da muss es irgendwo einen geheimen Code geben - oder ich versteh das doc2535 von ATMEL nicht :(.
Druckbare Version
Nun bin ich doch etwas in Sorge. Meine Assemblerroutine am tiny13 für den externen Interrupt läuft auch nicht. Da muss es irgendwo einen geheimen Code geben - oder ich versteh das doc2535 von ATMEL nicht :(.
Zu deinem GCC nochmal, du hast anscheinend nur das Manual von 1.4.6, ab dieser Version gibt es kein SIGNAL (SIG_OVERFLOW0) mehr, da heist es ISR(TIMER0_OVF_vect) und einiges andere mehr.
Danke Hubert.G für den Hinweis - ich bin gerade dabei, Software und "Handware" = Dokumentation auf Vordermann zu bringen und mich etwas besser einzulesen.
Als Fingerübung hatte ich inzwischen einen tiny13 diesen extInt0 aufgetragen - und mittlerweile auch hier dazugelernt. Aber das nutzt leider bei der Variante "C" für den mega16 garnix.
Ach so, ja, und in meiner ...\include\avr\iom16.h
da stehen beide Namen. Mal sehen, was die Alternative bringt.Zitat:
... Manual von 1.4.6, ab dieser Version ... kein SIGNAL (SIG_OVERFLOW0) mehr, da heist es ISR(TIMER0_OVF_vect) und einiges andere mehr.
Schönen Abend,
In deinem Prog das du mir geschickt hast fehlt der Aufruf für die Initialisierung des externen Interrupt XTI_01_init( )
Hallo Hubert.G,
vor Jahren hatte ich schon festgestellt, dass eigene Fehler sehr schwierig zu finden sind - na ja, mein Fehler fällt ja auch eher unter Schlamperei :(. Jetzt läuft´s, klar - dank Deiner Hilfe. ABER das Gute ist nun - ich habe bei dieser Lektion eine Menge über C gelernt.
Hallo Ihr,
einen schönen Abend erstmal. Danke für eure Hilfe und Ratschläge.
Ich habe das oben genannte Programm und die zugehörige Header-Datei in Anlehnung an die Demo für die RNControl mit Hilfe von hier (danke Hubert.G - habe dabei ein bisschen projektorientiertes C gelernt) auf den mega16 (in der RNControl) gebracht und danach erfolgreich auf einen tiny2313. Der war mir zu speicherarm, daher der Umstieg auf den 168. Und nun sitze ich den zweiten Tag (die zweite Nacht) und nix geht voran :(.
Die fuses passen - der 168 läuft nett, die Kontroll-LED blinkt (zum Auftakt - vor allen möglichen Initialisierungen) und der USART läuft auch schon hübsch.
Das war in einem anderen Thread. Ja, leider muss ich das schmerzhaft, na ja, nicht wirklich - blos sehr zeitaufwendig - erleben. Ausserdem läuft mein Timer0 schon wieder nicht (CTC, 50µsec Timer für mehrere Zwecke).Zitat:
Zitat von m.a.r.v.i.n
mit der ISRCode:void TMR_0_init( void )
{ //Initialisiere 8-Bit-Timer auf 10 kHz
TCCR0A |= (1<<WGM01); // Timer im CTC-Mode (doc S104)
TCCR0B |= (1<<FOC0A); // Forde Output Compare A (doc S105)
TCCR0B |= (1<<CS01); // Prescaler 1/8 / Clock <- CPU (doc S106)
OCR0A = 100; // Preset 100 für 50µs bei 16Mhz
TIMSK0 |= (1<<OCIE0A); // Compare Match IRQ
}
Es ist sogar leider so, dass USART läuft, aber keine PWM solange keine Interrupts erlaubt sind, aber natürlich eben dieser Timer nicht. Andersrum - wenn ich "sei" aktiviere, dann läuft kein USART - auch keine PWM und kein Timer0. Aber die main-Routine wird dauernd teilweise abgearbeitet . . . . offenbar ohne Aufruf der enthaltenen Routinen (sieht man am Blinzeln der LED :() und ohne die (ok, ok, die unschönen..) waitms nach dem Setzen von "sei".Code:/* === Nicht unterbrechbare ISR für timer ====================================== */
/* Diese Routine zählt hoch im Takt 20 kHz. Der Zählerwert wird von den ISR für
EXT_INT0 und -INT1 ausgelesen und den Werten Iz_yseci zugewiesen ...... */
// #define SIG_OUTPUT_COMPARE0A _VECTOR(14), siehe doc2545, S 63
SIGNAL(SIG_OUTPUT_COMPARE0A)
{
{
if (Izeit_1 < 60000) //Zeitstand Interrupt-Timer läuft von 1 .. 60 000
Izeit_1 ++; // d.h. alle 3 Sekunden wird der Stand erreicht
else
{ Izeit_1 = 0; // ansonsten: Rückstellen auf Null und
PORTC ^= (1<<PC2); } //LED3 toggeln, bei Izeit_1 max 60000 => 3 sec
}
PORTC ^= (1<<PC1); //LED2 toggeln, bei (prsc=1/8, OCR0=100)=> 0,050 ms
}
/* ============================================================================== */
/* ============================================================================== */
/* === HAUPTProgramm =========================================================== */
Ich habe das oben genannte Programm und die zugehörige Header-Datei in Anlehnung an die Demo für die RNControl mit Hilfe von hier (danke Hubert.G - habe dabei ein bisschen projektorientiertes C gelernt) auf den mega16 (in der RNControl) gebracht und danach erfolgreich auf einen tiny2313. Der war mir zu speicherarm, daher der Umstieg auf den 168. Und nun sitze ich den zweiten Tag (die zweite Nacht) und nix geht voran :(.Code:/* ============================================================================== */
/* === HAUPTProgramm =========================================================== */
/* Initialisierungen, LED1 kurzblinken als Signal für Programmstart,
Ausgabe des Indentifizierungsstrings per USART
*/
int main(void)
{
/* Encoder-Eingang 1 PortD2
Encoder-Eingang 2 PortD3 */
/*###Initialisierungsphase### */
//Pins bzw. Ports als Ein-/Ausgänge konfigurieren
DDRB |= 0x87; //10000111 -> PB0- B2: Mot 1,2 + PWM 1,2/3,4, PB7 Mot 1,2
DDRC |= 0x7F; //01111111 -> PC0 .. 6 , kein PC7-Pin
DDRD |= 0xF0; //11110000 -> PD6,7 Mot 3,4 sowie PD2,3 extInt
//Initialisierungen
setportcon(0); setportcon(1); setportcon(2); //Ports C (m168 hat nur 7)
setportcon(3); setportcon(4); setportcon(5); //... aus
init_tmrPWM(); //Initialisierung Timer für PWM
init_USART0(MYUBRR); //USART0 initialisieren mit wählbarer Baudrate (s.o.)
TMR_0_init(); //Initialisiere den Timer0-Interrupt (10 kHz)
XTI01_init(); //Initialisiere den externen Interrupt 0 und 1
for(i=0; i<20; i++)
{
setportcoff(0); //2 sek blinken mit LED1 nach dem Reset -
waitms(15); // damit man kurze resets besser erkennt
setportcon(0);
waitms(85);
}
waitms(1000);
sei(); //Globalen Interrupt freigeben
setportcoff(0);
waitms(2000);
setportcon(0);
waitms(2000);
sendUSART("FLEX168 mit 2drehzmess-168.c\r\n");
sendUSART("Version ~x05 vom 08jan08 23:42 mit (sei)\r\n");
sendUSART("Timer ist initialisiert auf 50 µsec ? ? ?\r\n");
for(;;){
setportcoff(0);
waitms(1000);
setportcon(0);
waitms(1000);
Mlinksstop();
Mrechtsstop();
setPWMlinks(0);
setPWMrechts(0);
Motst_aufab();
setportcoff(0);
waitms(1000);
setportcon(0);
waitms(1000);
}
}
Hätte da bitte jemand mal einen Rat? Ich sehe also einen Reset nach Setzen von "sei" und habe keinen Schimmer, warum das so ist. Danke im Voraus
Mittlerweile sehe ich, dass der µC in eine kurze Schleife (immer wieder reset?) fällt, sobald ich den hier vorgestellten Interrupt erlaube, aber auch bei "sei" für nur einen externen Interrupt ohne dem Timer0 - der garnicht auftreten konnte (Pull down am Eingang).
Wenn es ein Reset ist solltest du es an der LED an PortC0 erkennen. Ich glaube aber eher das du dich in deinen Interrupts verfängst. In jeden Interrupt eine LED die aufleuchtet wenn er angesprungen wird.
Wenn du der Meinung bist der Timer0 funktoniert nicht, dann probier ihn alleine, ohne drumherum aus. Probier alle Interrupts alleine aus und wenn sie dann funktionieren, dann erst stöpsle sie mit den anderen Programmteilen zusammen.
Danke m.a.r.v.i.n, danke Hubert.G,
heute nacht hatte ich schon einen Umbau gemacht "Abfangen" falscher Interrupts. Erstmal nur die zwei benachbarten Interrupts. Jetzt gehe ich dran, die ganze Liste abzufangen und mit Blinkzeichen zu melden. (Wenn das nicht klappt, mach ich Rauchzeichen draus und mache wieder auf dem mega16 weiter). Danke.
Hei, war das ein hübsche Arbeit :(.Zitat:
Zitat von Hubert.G
Zuerst natürlich:
und dann nach diesem MusterCode:PCICR = 0x00; // Verbiete ALLE Pin-Change-Interrupts
PCMSK0 = 0x00; // Verbiete ALLE Pin-Change-Interrupts an den entspr. Pins
PCMSK1 = 0x00; // Verbiete ALLE Pin-Change-Interrupts an den entspr. Pins
PCMSK2 = 0x00; // Verbiete ALLE Pin-Change-Interrupts an den entspr. Pins
. . . so ähnlich für alle 25 Vektoren. Nicht wirklich BCD und die waits brrrrrr - ok sagte ich mir, wenn er dorthin interruptet, dann ist er sowieso schon am Rande des Chaos. ABER - ich hatte damit den Fehler auf die Gegend um den vec 14 - Timer0-compx/OVF lokalisiert. Völlig rätselhaft. Für heute habe ich genug. Ich mache mit dem mega16 oder 32 weiter, leider geometrisch vier mal so gross und nur bis 16 MHz. Den m168 lege ich erstmal zu Seite - schade :(.Code:/* ============================================================================== */
/* === ISR für Timer1 Input Capt =============== */
/* Routine setzt LED auf Port PC1 1 Mal = Vektor 11 */
SIGNAL(TIMER1_COMPA_vect)
{
PORTC |= (1<<PC1); // Setze Port C1
PORTC |= (1<<PC2); // Setze Port C2
waitms(500); // Warte (einfach irre lang)
PORTC &= ~(1<<PC1); // Lösche Port C1
waitms(500); // Warte (einfach irre lang) 1
}
/* ============================================================================== */