- LiTime Speicher und Akkus         
Seite 3 von 6 ErsteErste 12345 ... LetzteLetzte
Ergebnis 21 bis 30 von 52

Thema: Timer für AVR ATtiny84 oder ander allgemein in C

  1. #21
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Anzeige

    Powerstation Test
    @ Wsk8: Danke dir. Aber so wie du das geschrieben hast setze ich im Register (TCCR0A) von Timer 0 den
    CTC- Modus und im Register (TCCR0B) von Timer 0 die entsprechenden Vorteilerbits ???
    Hast du dir das Datenblatt überhaupt mal angesehen??
    Klicke auf die Grafik für eine größere Ansicht

Name:	rn.png
Hits:	12
Größe:	97,9 KB
ID:	27674

    Hier ist alles eigentlich Idiotensicher aufgelistet.

    Im Table 11-8 gibts nur einen CTC-Mode und hier ist nur das WGM01-Bit gesetzt. Keine Ahnung wie du hier auf was anderes kommen kannst. Und hier steht auch, dass der MAX Value im OCRA steht. WGM00 und 02 sind "0" und müssen daher nicht beachtet werden. Keine Ahnung warum du hier den Reserved Mode wählst, ergibt für mich keinen Sinn.

    Zudem hab ich dir bereits einen zu 100% funktionierenden Code gepostet mit kurzer, prägnanter Erklärung. Vlt. solltest du den einfach 1 zu 1 kopieren, denn wie von Vorredner bereits gesagt, hast du es noch nicht mal geschafft andere Codeschnitzel richtig abzuschreiben und noch mehr Fehler eingebaut.

    Und um µC zu programmieren, muss man gute C-Kenntnisse besitzen. Nur leider wird C nicht zu Unrecht als "Hochsprache" bezeichnet und ist nicht Vergleichbar mit SPS, dass jeder mal in nem 2 Tage Seminar locker lernt. Das braucht Jahre!!

    mfg

  2. #22
    Neuer Benutzer Öfters hier Avatar von ooweberoo
    Registriert seit
    24.02.2014
    Ort
    66482 Zweibrücken
    Alter
    39
    Beiträge
    28
    Blog-Einträge
    1
    Hallo,

    nein das habe ich jetzt zum ersten mal gesehen.
    Ich habe mich an das gehalten
    Klicke auf die Grafik für eine größere Ansicht

Name:	ert.jpg
Hits:	6
Größe:	108,1 KB
ID:	27676
    und an
    Klicke auf die Grafik für eine größere Ansicht

Name:	ctc.jpg
Hits:	9
Größe:	101,4 KB
ID:	27677

    http://www.ne555.at/atmel-avr-mikroc...chnik/352.html
    http://www.physik.uni-regensburg.de/...er_Counter.htm
    http://www.mikrocontroller.net/articles/Uhr
    http://www.mikrocontroller.net/artic...A4hler_des_AVR

    Speziel an den ersten link hab ich mich gehalten.... dort wird es halt mit "CS02" gemacht.

    Zudem bleib bitte sachlich ! behaltet euere inkompetenten äußerungen für euch.

    weis nicht wieso ihr mich so angeht....wo liegt das problem?

    ich beschäftige mich mit der sache und stelle sachliche fragen und bedanke mich auch jedesmal.....

    echt das ist ganz unterste schublade....
    Geändert von ooweberoo (05.03.2014 um 19:52 Uhr)

  3. #23
    Erfahrener Benutzer Fleißiges Mitglied Avatar von derNeue
    Registriert seit
    01.01.2011
    Ort
    Bierstadt Radeberg
    Alter
    38
    Beiträge
    101
    http://www.mikrocontroller.net/articles/FAQ#Timer

    Dieser Artikel ist wirklich top geschrieben. Ich hatte am Anfang auch meine Probleme mit dem Datenblatt, aber eher, weils englisch ist. Dieser Artikel ist in deutsch geschrieben, und sehr anfängertauglich.

    Auch SPS lernt man nicht in zwei Tagen, das wirst du wohl gut wissen, zumindest wenn man den vollen Funktionsumfang einer SPS nutzen will. Ist mit den Controllern nicht anders. Ich habe mich am Anfang gewundert, wie manch einer aus einem Attiny unglaublich viel rausgeholt hat. Gerade Interrupts sind eigentlich nicht ein Thema, mit dem man beginnt. Ich denke, du willst einfach zuviel auf einmal. Klar isses am Anfang affig, eine LED zum blinken zu bringen. Da fragt man sich schon erstmal, was das bringen soll. Aber damit lernst du einfach die Grundlagen, die du nicht wirklich bereit bist, zu lernen. Es reicht nicht, ein tutorial einfach mal grob durchzulesen. Versuche, die Beispiele zu verstehen, versuche die Beispiele zum laufen zu bekommen. Wenn das klappt, mach einfach mal ein paar Änderungen am Code. Wenns danach nicht mehr läuft, versuch zu verstehen, warum das so ist und bring deinen geänderten Code zum laufen. So und nicht anders wirst du Erfolg haben. Du musst ganz einfach anfangen, und zwar mit eigenem Code. Und dann freut man sich, wenn eine LED leuchtet, wenn man den Taster drückt. Wenn du den Luxus einer SPS haben willst, dann bleib dabei, den wirst du bei einem Controller nicht bekommen.


    Dennis
    Ich studiere die Wirkung der Sonnenstrahlen auf das Liebesleben der Pflastersteine

  4. #24
    Neuer Benutzer Öfters hier Avatar von ooweberoo
    Registriert seit
    24.02.2014
    Ort
    66482 Zweibrücken
    Alter
    39
    Beiträge
    28
    Blog-Einträge
    1
    Hallo Dennis,

    ich muss dir voll zustimmen. Danke das du erwähnst das das SPS programmieren ebenfalls nicht einfach ist.

    Hab das mit den LED's usw. auch alles schon durch... sogar multiplexen war machbar....oder switch case statt die If Then Else Funktion... Die 7- Segmentanzeige hoch und runterzählen ging auch....
    Nur die Sache mit dem Timer hat mich verzweifeln lassen.... lag auch daran das die Tutorials und die Beispielprozessoren unterschiedlich sind. Des Weiteren ist Englisch auch nicht meine Stärke was
    das ohnehin komplexe Datenblatt noch komplexer werden lies. Der hellste bin ich auch nicht
    Gerade bei den Timern muss man die richtigen Register wählen.
    Aber trotzdem besteht noch Übungsbedarf, daher geht es weiter mit Tutorials und Übungen...
    Eigene Codes habe ich schon viel, vielleicht eher einfach was Profis zum lachen bringt aber voll funktionsfähig...
    Momentan beschäftige ich mich mit array und Pointern um Programme kürzer zu gestalten...

    Danke erstmal für deine / euere Hilfe!

  5. #25
    Erfahrener Benutzer Fleißiges Mitglied Avatar von derNeue
    Registriert seit
    01.01.2011
    Ort
    Bierstadt Radeberg
    Alter
    38
    Beiträge
    101
    Das Datenblatt ist schon komplex, keine Frage, aber ist auch logisch aufgebaut. Und da gibts auch für jeden Timer eine extra Kategorie, die du im Inhaltsverzeichnis des PDF anwählen kannst. Und am Ende dieser Kategorie gibts die Überschrift Register-Description, wurde hier schon von jemanden erwähnt und von dir ganz schnell ignoriert. Dort findest du alles wichtige zu den Registern nochmal zusammen gefasst. WEnn du nicht weist, was irgend ein Bit in so einem Register nun genau macht, hilft nur den Text davor lesen, da stehts genauer.


    Dennis
    Ich studiere die Wirkung der Sonnenstrahlen auf das Liebesleben der Pflastersteine

  6. #26
    Neuer Benutzer Öfters hier Avatar von ooweberoo
    Registriert seit
    24.02.2014
    Ort
    66482 Zweibrücken
    Alter
    39
    Beiträge
    28
    Blog-Einträge
    1
    Hallo zusammen,

    bin bis auf einige Feiheiten bei den Kommentaren soweit fertig.

    Was haltet ihr von diesem Uhrprogramm für 2 BCD Anzeigen. Zuerst eine Einleitshow, danach die Stunden für ca. 3 Sek und

    dann die Minuten für 3 Sek. und zuletzt wieder alles aus bis zum nächsten Knopfdruck.

    Nochmal ! Danke ! an alle die mir mit dem Timer geholfen haben! Als Verbesserung kommt eventuell noch ein Quarz dazu.

    Code:
    #include <stdlib.h>
    #include <avr/io.h>          // Makefile ATtiny 84
    #include <avr/interrupt.h>   // Datei für Interrupts
    #define F_CPU  1000000UL     // Prozessortakt festlegen
    #include <util/delay.h>      // Datei für Wartezeiten,immer nach CPU Takt einfügen
    
    
    //---- Variablen deklarieren ----
    volatile unsigned int Millisekunden;
    volatile unsigned int Stundenzehner;
    volatile unsigned int Stundeneiner;
    volatile unsigned int Minutenzehner;
    volatile unsigned int Minuteneiner;
    volatile unsigned int Sekunden;
    volatile unsigned int Tagessekunden;
    
    
    int i, t, e;
    
    
    
    
    //---- Hauptprogramm -------------------------------------------------------
    int main(void)
    {
    	
    //---------------------------------------------------------------------------------------------------------	
    //---8 Bit Timer CTC Modus aktivieren---------------------------------
    TCCR0A |= (1<<WGM01);		// im TCCR0A Register Bit für CTC Modus setzen
    TCCR0B |= (1<<CS01);		// im TCCR0B Register das entsprechende Bit für Vorteiler 8 setzen
    OCR0A = 125-1;				// Überlaufwert festlegen im Register OCR0A max. Wert 255 Bit., entsprechend berechnen für die gewollte Zeit
    							// 1.000.000Hz/8=125.000,  125.000Hz/125=1.000Hz,  T=1/f = 1/1000Hz =0,001 Sekunden
    							// Beim erreichen von 125 wird ISR(TIM0_COMPA_vect)ausgeführt, und somit die Variable "millisekunden" um 1 erhöt, nach 1000 Ausführungen ist 1 Sekunde vergangen!
    TIMSK0 = (1<<OCIE0A);		// Interupsfunktion einschalten
    sei();
    //----------------------------------------------------------------------------------------------------------------------
    //---- Uhr stellen--------------------------------------------------
    
    Stundenzehner = 0;
    Stundeneiner= 0;
    
    Minutenzehner = 1;
    Minuteneiner= 1;
    
    Millisekunden= 0;
    Sekunden     = 0;
    
    Tagessekunden = (Stundenzehner*36000)+(Stundeneiner*3600)+(Minutenzehner*600) +(Minuteneiner*60);
    //-----------------------------------------------------------------------------------------------
    
    t=3; //Wert der Variablen für Einleitshow vordefinieren
    i=0;
    
    
    //---------------------------------------------------------------
    //---- Endlosschleife---------------------------------------------------
     while(1)
     {
    
    
    
    
    if ( PINA & (1<<PINA7) ) //Wenn Pin PA7=1 dann zeige Uhrzeit sonst....
    {
    //----- Kleine LED Show vor der Zeitanzeige-------------------------------------------
     while (i !=t) //Schleife 5 mal durchlaufen
         {PORTB=0x3;	 
    	 //Start show
    	  DDRB = 0x01;
    	  DDRA = 0x01;
    	 _delay_ms(100);
    	  DDRA = 0x02;
    	 _delay_ms(100);
    	  DDRA = 0x04;
    	 _delay_ms(100);
    	  DDRA = 0x08;
    	 _delay_ms(100);
    	 
    	  DDRB = 0x02;
    	  DDRA = 0x08;
    	 _delay_ms(100);
    	  DDRA = 0x010;
    	 _delay_ms(100);
    	  DDRA = 0x20;
    	 _delay_ms(100);
    	  DDRA = 0x01;
    	_delay_ms(100);
    	 i=i+1;}
    //----------------- show Ende --------------------------------------------------------------------------------------
    //
    //----------------------------------- Zeit anzeigen Stunden ---------------------------------------------------------------
     while (e !=300)
     {
    //---- Multiplexen ----------------------------------------------------------------------------------------------
     PORTB=0x3; // Pull up Widerstände an Port B PB0+PB1 aktivieren. Ausgänge geben nun 5V aus.
     DDRB = 0x01;
    
           switch(Stundenzehner)//----- Ausgabe der Stundenzehner Segment 1 -----
            {case 0: DDRA = 0x3f; break;
    	 case 1: DDRA = 0x06; break;
    	 case 2: DDRA = 0x5b; break;}
    	 
     _delay_ms(5);// Multiplexzeit in der DDRB = (1 << DDB0)bzw. PB0 = 1 ist und nur Minutenzehner ausgegeben werden
    
    //---- Multiplexen --------------------------------------------------------------------------------------------
     PORTB=0x3; // Pull up Widerstände an Port B PB0+PB1 aktivieren. Ausgänge geben nun 5V aus.
     DDRB = 0x02;
    
           switch(Stundeneiner)//----- Ausgabe der Stundeneiner Segment 2 -----
           {case 0: DDRA = 0x3f; break;
    	case 1: DDRA = 0x06; break;
    	case 2: DDRA = 0x5b; break;
    	case 3: DDRA = 0x4f; break;
    	case 4: DDRA = 0x66; break;
    	case 5: DDRA = 0x6d; break;
    	case 6: DDRA = 0x7d; break;
    	case 7: DDRA = 0x07; break;
    	case 8: DDRA = 0x7f; break;
            case 9: DDRA = 0x6f; break;}
    
     _delay_ms(5);// Multiplexzeit in der DDRB = (1 << DDB1)bzw. PB1 = 1 ist und nur Minuteneiner ausgegeben werden.
    
     e=e+1; // Zählvariable für Schleifendurchlauf, pro Durchlauf um 1 erhöhen.
    }
    
      e =0;  // Schleifenzähvariablen auf 0 setzen
      i = 0;
    
    //----------------------------------- Zeit anzeigen Stunden ---------------------------------------------------------------
    while (e !=300)
     {
    //---- Multiplexen ----------------------------------------------------------------------------------------------
     PORTB=0x3; // Pull up Widerstände an Port B PB0+PB1 aktivieren. Ausgänge geben nun 5V aus.
     DDRB = 0x01;
    
       switch(Minutenzehner)//----- Ausgabe der Minutenzehner Segment 1 -----
        {case 0: DDRA = 0x3f; break;
          case 1: DDRA = 0x06; break;
          case 2: DDRA = 0x5b; break;
          case 3: DDRA = 0x4f; break;
          case 4: DDRA = 0x66; break;
          case 5: DDRA = 0x6d; break;}
    	
     _delay_ms(5);// Multiplexzeit in der DDRB = (1 << DDB0)bzw. PB0 = 1 ist und nur Minutenzehner ausgegeben werden
    //-------------------------------------------------------------------------------------------------------------- 
     
    //---- Multiplexen --------------------------------------------------------------------------------------------
     PORTB=0x3; // Pull up Widerstände an Port B PB0+PB1 aktivieren. Ausgänge geben nun 5V aus.
     DDRB = 0x02;
     
         switch(Minuteneiner)//----- Ausgabe der Minuteneiner Segment 2 -----
          {case 0: DDRA = 0x3f; break;
    	case 1: DDRA = 0x06; break;
    	case 2: DDRA = 0x5b; break;
    	case 3: DDRA = 0x4f; break;
    	case 4: DDRA = 0x66; break;
    	case 5: DDRA = 0x6d; break;
    	case 6: DDRA = 0x7d; break;
    	case 7: DDRA = 0x07; break;
    	case 8: DDRA = 0x7f; break;
    	case 9: DDRA = 0x6f; break;}
       
     _delay_ms(5);// Multiplexzeit in der DDRB = (1 << DDB1)bzw. PB1 = 1 ist und nur Minuteneiner ausgegeben werden.
     
     e=e+1; // Zählvariable für Schleifendurchlauf, pro Durchlauf um 1 erhöhen.
     }
     
      DDRA = 0x00;
      DDRB = 0x00; 
    //---------------------------------------------------------------------------------------------------------------
    }//if ende
    
    e =0;  // Schleifenzähvariablen auf 0 setzen
    i = 0;
    
     }// while(1) ende
    
    return 0;  
      
    }//int main(void) ende
    
    //--------- Interruptprogramm bzw. Unterprogramm -------------
    
    ISR(TIM0_COMPA_vect)
    {
      Millisekunden++;
    
      if(Millisekunden == 1000)
      {
    	  Sekunden++;
    	  Tagessekunden++;
    	  Millisekunden = 0;
    
    	  if(Sekunden == 60)	  
    		 {Minuteneiner++;Sekunden = 0;}
    	  
    	  if(Minuteneiner== 10)	  
    		 {Minutenzehner++; Minuteneiner = 0;}
    	  
    	  if(Minutenzehner == 6)	  
    		 {Stundeneiner++; Minutenzehner = 0;}
    	  
    	  if(Stundeneiner == 10)	  
    		 {Stundenzehner ++;Stundeneiner = 0;}
    	  
    
    	  if(Stundenzehner == 3)	  
    		 {Stundenzehner = 0;}
    	  
    
    	  if(Tagessekunden == 86400)	  
    		  {Stundenzehner = 0; Stundeneiner  = 0;
    		   Minutenzehner = 0; Minuteneiner  = 0;
    		   Sekunden      = 0; Millisekunden = 0;
    		   Tagessekunden = 0;}
    	  
      }
    }
    //---------------------------------------------------------------------------
    Geändert von ooweberoo (12.03.2014 um 19:42 Uhr)

  7. #27
    Erfahrener Benutzer Fleißiges Mitglied Avatar von derNeue
    Registriert seit
    01.01.2011
    Ort
    Bierstadt Radeberg
    Alter
    38
    Beiträge
    101
    Ich werf einfach mal folgendes in den Raum, was du einfach mal googlen kannst, Tastenentprellung.

    Als weiteres ist es ehrlich gesagt kein schöner Stil, Multiplexen mit delays zu realisieren. Sowas macht man auch in einem Timerinterrupt. Dafür kannst du ja einen anderen nehmen als den, den du bis jetzt schon nutzt. Dazu gibts eigentlich auch den ein oder anderen Code frei im Netz. Einfach mal suchen und schauen, wie das andere gelöst haben. Das hat einen ganz einfachen Vorteil. Bis jetzt änderst du ja einfach nur ein paar Variablen in deinem Interrupt. Aber es gibt ja auch andere Anwendungen für 7-Segment-Anzeigen, wo du in deinem Hauptprogramm auch noch anderen Code ausführen willst. Da kommt es dann mit deiner Methode zu Problemen.


    Dennis
    Ich studiere die Wirkung der Sonnenstrahlen auf das Liebesleben der Pflastersteine

  8. #28
    Neuer Benutzer Öfters hier Avatar von ooweberoo
    Registriert seit
    24.02.2014
    Ort
    66482 Zweibrücken
    Alter
    39
    Beiträge
    28
    Blog-Einträge
    1
    Hallo,

    ok, als Anfänger gibt es eben noch viel zu lernen.... ich bin jedoch forh das ich erstmal die gewünschte Funktion umsetzten konnte...

    Entprellen wollte ich sowieso, hatte ich vergessen zu erwähnen

    Ein weit aus größeres Problem stellt für mich der externe Quarz dar. Ich will mich mit falsch gesetzten Fusebits nicht aus dem µC

    aussperren. Wollte eine 10MHz Quart mit 2X 22pF Kondensatoren nutzen. Gleicher Takt wie der interne Quarz.

    Leider werd ich aus den Fusebits nicht ganz schlau...hab nur ein 8 Bit Fusebit Register....

    Wenn du dazu vielleicht noch etwas weist ?

    Einmal den Haken falsch gesetzt und das wars dann.... blöde Sache.... so sieht mein Fusebit Register aus!

    Klicke auf die Grafik für eine größere Ansicht

Name:	fusebits_ATtiny84.jpg
Hits:	8
Größe:	110,7 KB
ID:	27809

  9. #29
    Erfahrener Benutzer Fleißiges Mitglied Avatar von derNeue
    Registriert seit
    01.01.2011
    Ort
    Bierstadt Radeberg
    Alter
    38
    Beiträge
    101
    Hallo!

    ok, als Anfänger gibt es eben noch viel zu lernen
    Das ging allen so. Aber mit der richtigen Fragestellung bekommst du hier auch umfassende Hilfe

    Ein weit aus größeres Problem stellt für mich der externe Quarz dar.
    Die Frage ist, warum willst du unbedingt einen externen Quarz nehmen? Belasse es doch erstmal bei dem internen, damit kannst du nix verfusen. Ich glaube nicht, dass du schon Anwendungen programmierst, die unbedingt einen externen Quarz benötigen. Oder warum willst du unbedingt einen einsetzen?

    Dennis
    Ich studiere die Wirkung der Sonnenstrahlen auf das Liebesleben der Pflastersteine

  10. #30
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Du musst ganz unten die richtige Clock auswählen. Bei einem Quarz immer Ext Crystal!
    Hier gibts ne Liste, was für 10MHz geeignet ist.

    mfg

Seite 3 von 6 ErsteErste 12345 ... LetzteLetzte

Ähnliche Themen

  1. Datenübertragung Bluetooth (oder Funk allgemein)
    Von Bumbum im Forum Software, Algorithmen und KI
    Antworten: 0
    Letzter Beitrag: 21.09.2012, 10:02
  2. ATTiny84 Pegelbegrenzung mit Zenerdiode oder wie?
    Von DanielSan im Forum AVR Hardwarethemen
    Antworten: 25
    Letzter Beitrag: 01.12.2011, 14:40
  3. 5V Netzteil gesucht oder allgemein guter Hersteller
    Von kini im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 5
    Letzter Beitrag: 25.03.2010, 12:33
  4. Ander controller programmieren?
    Von BlackDevil im Forum Elektronik
    Antworten: 10
    Letzter Beitrag: 26.08.2006, 01:20
  5. Bspcode in assembler für AVR Timer
    Von Shadowrun im Forum AVR Hardwarethemen
    Antworten: 5
    Letzter Beitrag: 09.02.2005, 14:55

Stichworte

Berechtigungen

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

LiFePO4 Speicher Test