- LiFePO4 Speicher Test         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 32

Thema: CTC + timer0 auf mega16 - geben keinen Interrupt (auch m168)

  1. #21
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.655
    Anzeige

    Praxistest und DIY Projekte
    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 .
    Ciao sagt der JoeamBerg

  2. #22
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    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.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  3. #23
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.655
    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
    ... Manual von 1.4.6, ab dieser Version ... kein SIGNAL (SIG_OVERFLOW0) mehr, da heist es ISR(TIMER0_OVF_vect) und einiges andere mehr.
    da stehen beide Namen. Mal sehen, was die Alternative bringt.

    Schönen Abend,
    Ciao sagt der JoeamBerg

  4. #24
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    In deinem Prog das du mir geschickt hast fehlt der Aufruf für die Initialisierung des externen Interrupt XTI_01_init( )
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  5. #25
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.655
    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.
    Ciao sagt der JoeamBerg

  6. #26
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.655
    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.
    Zitat Zitat von m.a.r.v.i.n
    ... Einige Registernamen und Bedeutungen haben sich beim mega168 auch geändert (Timer z.B.)...
    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).
    Code:
    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 
    }
    mit der ISR
    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 =========================================================== */
    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:
    /* ============================================================================== */
    /* ===  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);
    	}
    }
    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 .

    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
    Ciao sagt der JoeamBerg

  7. #27
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.655
    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).
    Ciao sagt der JoeamBerg

  8. #28
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    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.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  9. #29
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.655
    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.
    Ciao sagt der JoeamBerg

  10. #30
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.655
    Zitat Zitat von Hubert.G
    ... In jeden Interrupt eine LED die aufleuchtet wenn er angesprungen wird...
    Hei, war das ein hübsche Arbeit .

    Zuerst natürlich:
    Code:
        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
    und dann nach diesem Muster
    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
    }
    /* ============================================================================== */
    . . . 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 .
    Ciao sagt der JoeamBerg

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress