- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 4 von 4

Thema: Hilfe bei Atmega8 Timer/Counter1 für CTC Modus

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    22.03.2013
    Beiträge
    6

    Hilfe bei Atmega8 Timer/Counter1 für CTC Modus

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo liebe Experten und Kenner,

    Ich bin schon etwas länger mit der C++ Programmierung dabei und habe erste Erfahrung bei Mikrocontrollern.
    Nun möchte ich mein Wissen etwas vertiefen und beschäftige mich etwas mehr um die Controller besser kennenzulernen um später mal meinen eigenen Roboter zu bauen. Momentan beschäftige ich mich mit den Atmega8.

    Mit den 8bit Timer/Counter0 und 2 bin ich schon zurecht gekommen nun wollte ich mich mit den 16-Bit Timmer/Counter1 beschäftigen.
    Ich möchte, damit man es auch sieht, eine LED mit 4 Hz blinken lassen. später soll es als Signalgabe benutzt werden.

    Ich stelle euch mal mein Code zur Verfügung und ich hoffe ihr findet meinen Fehler bezw. falschen Ansatz.

    Code:
    #define F_CPU 8000000				// CPU Taktfrequenz intern 8 MHz
    
    // Einbindung der Includedateien
    #include <util/delay.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    // Ein-und Ausgangsbestimmung
    #define _zu_Eingang(Register,Pin)	Register&=~(1<<Pin)		// Beispiel:
    								// setze PB1 als Eingang
    								// _zu_Eingang(DDRB,PB1);
    															
    #define _zu_Ausgang(Register,Pin)	Register|=(1<<Pin)		// Beispiel:
    								// setze PB1 als Ausgang
    								// _zu_Eingang(DDRB,PB1);
    // Funktion Warte
    void warte (int ms){
    	for (int i=1;i<ms;i++)
    	{
    		_delay_ms(1);
    	}
    }
    
    // Funktionen Schalte Ausgänge
    void set_PortB_Pin(int Pin){
    	DDRB |= (1<<Pin);
    }
    
    void clear_PortB_Pin(int Pin){
    	PORTB &= ~(1<<Pin);
    }
    
    void toggle_PortB_Pin(int Pin){
    	PORTB ^= (1<<Pin);
    }
    
    void ini_PWM(void){
    cli();	//sperre interrupte	
    //1. Prescaler	
    TCCR1B |= (1<<CS10)	|	(1<<CS11);				// Prescaler = 64
    
    //2. Modus
    TCCR1B |= (1<<WGM12);							// CTC Modus
    
    TIMSK |= (1<<TOIE1);							// setze interrupt beim Überlauf
    
    //3. Frequenz
    OCR1A = 0xF424;					//				8MHz	/
    OCR1B = 0xF424;					//			2Hz	*	64(Prescaler)
    						//				= 62500 =0xF424 in HEX
    sei();	                                                                     //erlaube interrupte
    }
    
    void stoppe_PWM(void){
    	TCCR1B &= ~(1<<WGM12);		
    }
    
    void starte_PWM(void){
    	TCCR1B |= (1<<WGM12);		
    }
    
    ISR(TIMER1_COMPB_vect){
    	toggle_PortB_Pin(PB1);
    
    }
    
    int main(void)
    {
    	DDRB=0xFF;
    		set_PortB_Pin(PB1);
    		clear_PortB_Pin(PB2);
    		starte_PWM();	
        while(1)
        {	
    		toggle_PortB_Pin(PB2);
    		warte(500);
        }
    }

    Das ist der Code, wie man vll sieht sollte Die LED an PB1 per CTC ISR alle 2 Sek getogglet werden, jedoch bleibt sie aus wieso kann mir da wer helfen wo der falsche Ansatz ist?

    Ich hoffe an viele Antworten und Kritik

    Grüße aus Hamburg
    Geändert von robotka (22.03.2013 um 13:10 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Du rufst die Initialisierungsfunktion nie auf.

    Davon abgesehen finde ich die komischen Hilfsfunktionen zum setzen und löschen von Bits reichlich unnötig ...

    mfG
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    16.04.2011
    Beiträge
    78
    Guten Tag,

    auf Anhieb hätte ich die Frage, warum du die wait() einsetzt, wenn du die LED per Timer+Interrupt toggelst?
    Auch fällt ein, dass du mit
    Code:
    TIMSK |= (1<<TOIE1);
    einen Interrupt beim Überlauf setzt, nicht beim Erreichen des Vergleichswertes.

    MfG Nik

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    22.03.2013
    Beiträge
    6
    Hey vielen Dank euch beiden! das ich die init nicht eingebunten habe war natürlich ganz schön doof und peinlich und das mit der falschen ISR vielen dank das habe ich auch übersehen! danke ihr habt mir weitergeholfen und ich kann nun weiter daran basteln!

Ähnliche Themen

  1. Problem mit Timer1 als Counter im CTC Modus und Interupt
    Von Anam52 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 26.02.2013, 16:34
  2. Timer im CTC-Mode
    Von BoGe-Ro im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 27.06.2011, 10:34
  3. [ERLEDIGT] ATMega 16 Timer 1 CTC Probleme
    Von Franky55555 im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 14.06.2011, 18:18
  4. CTC Timer mit mega168
    Von phyro im Forum C - Programmierung (GCC u.a.)
    Antworten: 12
    Letzter Beitrag: 08.08.2009, 19:58
  5. 16Bit Timer/Counter 1 bei ATmega8 | Hilfe zu den Registern
    Von Sauginius im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 09.06.2005, 16:14

Stichworte

Berechtigungen

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

Labornetzteil AliExpress