- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: NIBOBee und Timer- für Anfänger

  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.208

    NIBOBee und Timer- für Anfänger

    Anzeige

    Praxistest und DIY Projekte
    Hallo zusammen.
    Seit einigen Tagen versuche ich, einen Timer an meiner Biene zum laufen zu bekommen und ich weiss nun, dass ich keine Ahnung von habe.

    Tutorials habe ich jede Menge gefunden, die sich mit dem Thema auseinandersetzen, aber mehr als das gundsätzliche Wissen, wie sowas gehen müsste, kam dabei nicht heraus.

    Kurz gesagt: ich möchte einen Timer programmieren, der mir für den Anfang einfach in bestimmten Zeitabständen eine LED blinken lässt, währen die Biene irgendwas anderes tut.
    Ich denke, wenn ich das hinbekomme, komme ich soweit zurecht- es fehlen mir schlichtweg die Grundlagen, wie man sowas programmiertechnisch angeht.

    Leider bin ich nicht wirklich fündig geworden, Tutorials, wie man mit nem ATMega16 eine Uhr programmiert, sind viel zu verwirrend, und ich denke, da bin ich nicht der Einzige, dem das so geht.
    Ich will keine Uhr, die aus nem ATMega16 und _aller möglichen anderen Hardware_ besteht, sondern nur wissen, wie ich einen Timer im NIBOBee einrichte, der mir von Zeit zu Zeit einen Interrupt liefert.

    Wäre nett, wenn man daraus vielleicht eine Art Workshop machen könnte, denn wie gesagt: ich bin mir sicher, dass das nicht nur mir so geht.
    Es wäre wirklich schön, das ganze (und wichtig: an genau diesem Beispiel) mal richtig einsteigerfreundlich erklärt zu bekommen, auch das was, warum und wie, denn irgendwelche Codes abtippen bringt es nicht.

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    18.12.2009
    Ort
    Halle (Saale)
    Alter
    68
    Beiträge
    30
    Hm. So richtig weiß ich ehrlich gesagt nicht, wie man das besser als hier http://www.rn-wissen.de/index.php/Ti...nter_%28Avr%29
    erklären könnte. Hast Du soetwas schon probiert?

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.208
    Ja.
    Funktioniert auch, wenn ich standhaft bin und die Bibliotheken der Biene nicht benutze. Leider finde ich die aber nunmal ganz praktisch.

    Es geht nicht darum, erklärt zu bekommen, wie so ein Timer _grundsätzlich_ funktioniert (googlen, lesen und auch ein einigermassen verstehen bekomme ich durchaus hin), sondern darum, dass ich in der NIBOBee-Doku beispielsweise kein Wort über die von den Bibliotheken bereits verwendeten Timer finden kann.
    Somit kann ich zwar herumprobieren, darf aber jedesmal, wenn ich irgendeine Funktion der Bibliothek benutzen will (wie z.B. den Liniensensor, oder einfach delay) mit Überraschungen rechnen.

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.686
    Zitat Zitat von Rabenauge
    ... googlen, lesen und auch ein einigermassen verstehen bekomme ich durchaus hin ...
    Stimmt, ich weiß, daß DU das kannst, aber das kriegt nicht jeder hin ;-)

    Zitat Zitat von Rabenauge
    ... in der NIBOBee-Doku beispielsweise kein Wort über die von den Bibliotheken bereits verwendeten Timer finden kann ...
    So etwas habe ich bisher auch nicht gefunden. BTW: ich nehme an, dass Du die Dokumentation der C Bibliothek für den NIBObee Roboter kennst. Die liegt vermutlich bei Dir auf der C: , möglicherweise auf Deiner Festplatte C:\Programme\NIBObeeLib\doc\html\index.html. Wenn nicht, dann müsstest Du Dir "die Bibliothek" installieren. Im NIBO-Wiki gibts auch etwas, aber vermutlich nicht wirklich das, was Du suchst : http://www.nibo-roboter.de/wiki/Bibliothek , aber das habe ich (noch) nicht durchgängig getestet. Leider hatte bei Abgabe meiner Testberichte an nicai.systems nur festgestellt, dass die saubere, umfangreiche Auflistung der Routinen, Funktionen, Variablennamen etc. etwas sehr versteckt ist. Das Fehlen einer Tabelle aller benutzten Interrupts, Timer u.ä. war mir damals noch nicht aufgefallen.

    Was ich vermisse ist etwas Ähnliches, wie das, was ich für meinen R2D03/Dottie und Nachfolger gemacht habe, siehe Attachment.
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken plan_irupts_timr.gif  
    Ciao sagt der JoeamBerg

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.208
    Ja, klar kenne ich die Doku zur Bibliothek.
    Ohne die wäre das Ganze -für mich- unlösbar.
    Sie ist im Grunde das einzige Nachschlagewerk, was mich wirklich weiter bringt, da sie eben auf den NIBOBee passt. Leider eben ist nicht alles drin, was man (Anfänger- angeblich ist der Roboter für solche doch?) braucht.

    Für mich kommt vieles zusammen: erstens habe ich, da ich einige Jährchen mit der eingeschränkten Funktionalität von NQC zu leben gelernt habe (dort hast du kein Problem mit Timern, du kannst ganz einfach zehn getrennte Tasks zugleich laufen lassen, um alles andere kümmert sich die Firmware alleine) habe, nun eine schier unübersehbare Masse an Möglichkeiten.
    Das ist Klasse, das macht Spass, vorausgesetzt, man kommt damit klar, wenigstens kleinere Erfolge sind immer ganz nett.
    Wenns aber _gar_ nicht weitergeht -wieviele Bienen liegen schon wieder, einstaubend herum? Wills gar nicht so genau wissen, meine wird das nicht tun.

    Nun hatte ich vorher auch nie einen Grund, auch nur in ein Datenblatt zu sehen- wozu auch? Und ganz ehrlich: das meiste, was ich da sehe, ist -noch- kryptisches Zeugs. Ich werd das nötige lernen, das ist sicher, nur wann? Kleinere Erfolge, von Zeit zu Zeit wären eben...sagte ich ja schon.

    Deine Tabelle ist genial, so ungefähr stelle ich mir das vor, wenn man in die Doku der Bienenbibliothek schaut, macht es richtig Spass wenn da ein Link ist (ich glaub, der ist auf jeder Seite, immer mit dem gleichen, etwas...demotivierenden Ergebnis) "mehr Informationen".
    Dort steht dann exakt das Gleiche wie _vor_ dem Link auch, kein Buchstabe mehr, auch keiner weniger. Tooooll

    Vielleicht könnte man so eine Tabelle auch mal fürs Bienchen zusammentragen, ich bin sicher, dass hier einige Füchse die schon haben, oder?
    Soweit meine, bisher eher bescheidenen, Kenntnisse helfen können (ich bin hochmotiviert, seit ich allmählich zu begreifen beginne, was in dem kleinen Ding _wirklich_ steckt), wäre ich da `türlich auch dabei.
    Achja: ich bin, glaub ich, zu doof in Word (oder was auch immer man dafür hernimmt) eine Tabelle zu erstellen, denk ich, kann man die vielleicht in nem 3D-Programm wie Blender...?

    Wie gesagt, es macht mir wirklich Spass, und ich denke, man kann die Biene (der Aufbau war ja im Grunde echt ein Kinderspiel) durchaus auch Anfängern guten Gewissens empfehlen, aber es fehlt hat noch was.
    Keine Ahnung, was Nicai noch so in der Hinterhand hat (irgendwo las ich auch mal einen mehr oder weniger versteckten Hinweis auf Erweiterungen), aber im Moment tut sich scheinbar nichts- und wenn, merkts keiner. Schon schade, zumal ja die Bibliothek auch noch nicht fertig ist, wie aus der Doku _auch_ hervorgeht.

    So, morgen schaue ich mal mit den Timern weiter, mein heutiger Test (ich hatte den Timer0 "verbogen") hat....merkwürdige Ergebnisse gebracht, das schau ich mir morgen mal an-aber das Programm war auch noch nich wirklich fertig.

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.686
    Zitat Zitat von Rabenauge
    ... einige Jährchen mit der eingeschränkten Funktionalität von NQC zu leben gelernt habe ...
    Gleich JAHRE lang ! ? Ohh boy, this is Not Quite Cool.

    Zitat Zitat von Rabenauge
    ... Datenblatt zu sehen- wozu auch? Und ganz ehrlich: das meiste, was ich da sehe, ist -noch- kryptisches Zeugs ...
    Klar, ist wie beim Auto. Wenn Du Autofahren aus dem Buch lernst - und nie vorher damit Kontakt hattest, kannst Du Dir auch nicht richtig vorstellen, wozu das Kupplungspedal ist. In der Fahrschule - einmal zu schlapp getreten - und alles ist klar.

    Zitat Zitat von Rabenauge
    ... Deine Tabelle ... so ungefähr stelle ich mir das vor ... Vielleicht könnte man so eine ... fürs Bienchen zusammentragen ... Word ... eine Tabelle zu erstellen ....
    Ich habe die mit Excel gemacht. Excel ist zwar nix für Textverarbeitung (ausser in Gates own country) - aber für solche Tabellen sehr gut zu nutzen. Und ich brauchte das natürlich, da ich sowohl R2D03 und R3D01, den kleineren Bruder mit 0,15 Liter, selbst geplant hatte. Ohne solche Pläne hätte ich ja den Überblick total verloren. Daher bin ich ganz sicher, dass die Hersteller so ein Blättchen irgendwo rumliegen haben, warum das nicht bereitgestellt wird . . . ? Ok, dann ... bin hochmotiviert ... wäre ich da `türlich auch dabei ... ... dann weißt Du ja, was Du in ruhigen Stunden tun darfst. Schon mal danke im Voraus *hihi*. Schönen Sonntag - und grüße ins OstE - manchmal bin ich in Auerbach/V.

    Ein Tipp für die laufende Arbeit. Ich übersetze meine C(äh)-Codes mit AVRStudio. In der subdirectory ../default steht nicht nur die *hex, sondern auch eine Datei namens *.lls. Schau mal da rein, öffnen z.B. mit notepad. Da drin findest Du jedenfalls alle aktuell für Deine *.hex verwendeten Routinen namentlich aufgelistet. Und Timerroutinen sind ja meist irgendwo hinter "ISR(TIM..." versteckt.
    Ciao sagt der JoeamBerg

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.208
    Ja, mein RCX dürfte inzwischen bestimmt zehn Jährchen aufm Buckel (okok, bei LEGO heisst das Noppen) haben. Ist noch der 1.5er.
    Zu dem bin ich mehr durch günstigen Zufall gekommen, ich hab damals das Komplettset für DM 150 bekommen.
    Und wie weit man mit der LEGO-Programmierumgebung kommt, war mir ziemlich schnell klar. Ist ja ganz nett, um schnell was zu erleben, aber das wars dann auch.
    Aber meine Philosophie ist halt, dass LEGO eben LEGO bleibt, und drum wollte ich auch die originale Firmware (da allerdings schon die letzte Version) laufen haben. Und mit Fremdteilen aufrüsten kam schonmal gar nicht in Frage- deswegen auch der Wechsel.
    Den RCX halte ich trotzdem in Ehren, er kann bestimmt (so doof, wie man denkt, wenn man LEGO hört, ist das Ding keineswegs, der kann _richtig_ was) mal mit der Biene zusammen spielen, da bin ich sicher.
    Ist halt irgendwie schick, auch die Programmierung per IR-Schnittstelle, kein Kabelgedöns, nix, hinstellen, Button klicken, und gegebenenfalls gleich noch per PC starten.

    Excel also für die Tabelle, das ist genial, denke ich: ich weiss, dass es so ein Programm gibt, ich habe es sogar aber noch nie _irgendwas_ damit anfangen können.
    Dann lieber noch Word.

    Naja, wird schon. Im Moment taue ich erstmal auf (ich hatte das Vergnügen, vier Stunden im Freien arbeiten zu dürfen heute) und dann schau ich mal, was die Biene sich über Nacht so überlegt hat.

  8. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Die Library der bee ist durch ihre vielen Einzeldateien für Anfänger nicht einfach zu durchschauen. Was den Einstieg zudem erschwert ist die Verwendung von Makros (in iodefs.h definiert) für den Zugriff auf die Kontrollerregister. Um die von der Lib belegten Timer zu finden bleibt letzlich nur der beschwerliche Weg jeweils die Init-Funktionen die Teildateien zu untersuchen. Dann wird man in motpwm.c fündig: Hier wird in motpwm_init() der Timer 1 zur PWM-Ansteuerung der Motoren parametriert.

    Ein Timer/Counter besteht aus einem Zählregister TCNTx, einem Vergleichsregister OCRx und einem Kontrollregister TCCRx (x steht hierbei für die Nummer des Timers)

    Das Zählregister wird mit dem Timertakt von der Hardware unabhängig vom Programm weitergezählt. Neben anderen Möglichkeiten kann man den Timertakt auch aus dem Kontrollertakt erzeugen, Mithilfe des im Kontrollregister einstellbaren Prescaler (=Vorteiler) kann man den Timertakt verlangsamen.

    Bei bestimmten "Ereignissen" kann der Timer eine Interruptanforderung erzeugen. Diese wird vom Kontroller erkannt und bearbeitet, wenn der entsprechende Interrupt im TIMSK-Register (TIMer interrupt maSKe) aktiviert ist und die Interrupts generell erlaubt sind (sei()).

    Ein mögliches Ereigniss ist der Überlauf des Zählregisters. Wenn dies auftritt, wird ein Overflow-Interrupt signalisiert und die zugehörige Interruptserviceroutine ISR(TIMERx_OVF_vect) ausgeführt. Ein weiteres Ereigniss ist eine Übereinstimmung des Zählregisters mit dem Inhalt des Vergleichsregisters. Dieses Ereigniss erzeugt einen Match-Compare-Interrupt ISR(TIMERx_COMP_vect) (treffender Vergleich)

    Die Timer kennen verschiedene Modi. Beim normalen Mode wird das Zählregister stur durchgezählt. Beim CTC-Mode wird nur bis zum Wert im Vergleichsregister gezählt, dann ein Comp-Interrupt ausgelöst und das Zählregister wieder auf null gesetzt. In der Fast-PWM-Betriebsart wird ebenfalls aufwärts gezählt, allerdings können hier bei 16-bit-Countern die Anzahl der Bits des Zählregisters verändert werden. Letztlich gibt es noch den Phase-Correct-PWM-Mode. Dieser zählt aufwärts bis zum Maxwert des Zählregisters und zählt dann rückwärts (!) wieder auf null. Bei null wird dann ein Overflow ausgelöst, Comp tritt bei Gleichheit mit dem Vergleichsregister in beiden Zählrichtungen auf!

    Jetzt wagen wir uns mal an die Praxis. Grundkenntnisse in C sollten vorhanden sein, Zugriff auf Register des Kontrollers sollte beherrscht werden, das Datenblatt sollte bereit liegen und der Schaltplan der bee könnte auch hilfreich sein. Die gestellte Aufgabe: Eine Led im Sekundentakt blinken lassen. Ich wähle LED3 an Port B3. Da Timer1 schon belegt ist, verwenden wir Timer0.

    Bevor wir nun losprogrammieren müssen wir etwas rechnen. Die bee läuft mit 15MHz Kontrollertakt. Wenn wir den Takt mit 1024 vorteilen kommen wir auf knapp 15000 Zähltakte pro Sekunde, bei 256 Zählschritten bis zum Überlauf ergibt das ca. 57 ISR-Aufrufe pro Sekunde:

    Code:
    // LED3 ansteuern mit Timer 0                                          14.3.2010 mic
    
    #include <nibobee/iodefs.h>
    #include <avr/interrupt.h>
    
    int main(void)
    {
       TCCR0 = (1<<CS02) | (1<<CS00); 		// Normal Mode, kein OC0-Pin, prescaler /1024
       TIMSK |= (1<<TOIE0); 					// Timer0 Overflow-Interrupt erlauben
       
    	enable_interrupts();
       
       DDRB |= (1<<PB3); 						// LED an einem Ausgang
       PORTB &= ~(1<<PB3); 						// LED aus
       
    	while(1)
    	{
    	   // nix zu tun
       }
    
    }
    ISR(TIMER0_OVF_vect)
    {
    	static uint8_t count=0;
    
    	count++;
    	if(count == 57) PORTB |= (1<<PB3); 	// LED an
    	if(count > 2*57)
    	{
    		PORTB &= ~(1<<PB3); 					// LED aus
    		count=0;
    	}
    }
    Der eigentliche Trick ist natürlich eine günstige Kombination aus Prescaler und Betriebsart des Timers zu finden. Das Beispiel dient nur zum Einstieg...

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.208
    Dann frage ich mal quer rein (sorry, genau da hing ich gestern Abend fest):

    Code:
    #include <nibobee/iodefs.h>          
    #include <nibobee/led.h>
    #include <nibobee/delay.h> 
    
    int main(void)
    {
      								// Timer 0 konfigurieren
      TCCR0 = (1<<CS00);
      TCCR0 = (1<<CS02);			// Prescaler 1024
     
      								// Overflow Interrupt erlauben
      TIMSK |= (1<<TOIE0);
       								
      enable_interrupts();			// Global Interrupts aktivieren
     
      while(1==1)					//mach was;
      {								//hier nur ein Lauflicht mit drei LED`s
        
    	
    	int ledNr; 
    		led_set(ledNr,0);
    		delay(700);
    		for (ledNr=0;ledNr<3;ledNr++) 
    			{ 
    			led_set(ledNr,1); 
    			delay(350); 
    			} 
    		delay(350);
    		for (ledNr=3;ledNr>0;ledNr--)
    			{
    			led_set(ledNr,0);
    			delay(350);
    			}
    	
      }
    }
     
    /*
    Der Overflow Interrupt Handler
    wird aufgerufen, wenn TCNT0 von
    255 auf 0 wechselt (256 Schritte),
    d.h. ca. alle 2 ms  <<<Werte stimmen nicht, da Prescaler auf 1024 statt auf 8 und
    der ATMega16 auf 16MHz läuft
    */
    ISR (TIMER0_OVF_vect)
    {
      /* Interrupt Aktion alle
      (1500000/1024)/256 Hz = 57,22045898 Hz
        */
    }
    Der von mir gepostete Code stammt, mit kleinen Änderungen aus einem der Tutorials betreffs Timer.
    Da ich noch nix habe, was auf den Interrupt hin passieren sollte, passiert auch nix, ist soweit klar.
    Ergänzt habe ich den Code (einfach, um zu sehen, das was passiert) mit nem kleinen LED-Lauflicht auf LED 1-3.
    Soweit funktioniert das Programm auch wie gewünscht, ABER: die LED`s glimmen nur, sie leuchten nicht ordentlich.
    Ich hab den Code übrigens einfach aus nem Lauflicht herauskopiert, was durchaus bestens funktioniert (dort leuchten sie mit voller Helligkeit, wie das soll).
    What`s this?
    Kann, wenn es weiterhilft, auch das richtig funktionierende Programm posten (ich schätze, das ist nichts als eine Erweiterung des LED-Programmes aus dem Tutorial der Biene gewesen).

    Hardwareprobleme kann ich ausschliessen, das ursprüngliche Programm läuft nach wie vor tadellos.
    Mögliche Fehler bei den Spielereien mit dem Timer auch, da man auch die betreffenden Zeilen auskommentieren kann, und trotzdem glimmen die LED`s nur.
    Kurz gesagt: HILFE...


    So, nun schau ich mir dein Beispiel mal an...und bin gespannt.

  10. #10
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Dann liege ich mit meinem Beispiel ja schon ganz richtig. Bei deinem Programm steckt hier ein Fehler:

    TCCR0 = (1<<CS02); // Prescaler 1024

    So werden alle Bits des TCCR0-Registers geändert, bis auf CS02 werden alle, auch CS00, auf null gesetzt (=gelöscht). Um die anderen Bits nicht zu verändern muss man den alten Inhalt des TCCR0 erst auslesen und dann gezielt das gewünschte Bit setzen:

    TCCR0 = TCCR0 | (1<<CS02);

    oder kurz:

    TCCR0 |= (1<<CS02);

    Die LEDs glimmen nur, weil du led_init(); vergessen hast. Damit werden die Pins der LEDs auf Ausgang gesetzt.

    Da ich noch nix habe, was auf den Interrupt hin passieren sollte,...
    Ein schlichtes
    Code:
    ISR (TIMER0_OVF_vect)
    {
       led_set(3,1);
    }
    würde schon ausreichen um zu erkennen, ob die ISR überhaupt aufgerufen wird :)

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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

12V Akku bauen