mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer Falsch? servo reagiert nicht


Autor: Sonke A. (soeni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, dass ich wieder mal störe aber ich habe ein problem, ich habe 
entlich verstanden wie timer grundsätzlich funktionieren. ich habe eine 
led zum blinken gebracht, soweit sogut, dann wollte ich den timer so 
umfunktinieren, dass alle 0,1 ms ein interrupt ausgelößt wird, also bei 
8 mhz alle 800 takte. ich teile also mit dem prescaler den takt durch 8 
und zähle im timer bis hundert.

in der interruptrutine warte ich 200 interrupts ab (20ms) um dann 1ms zu 
warten. (muss ja mindestens gewartet werden) anschließend warte ich noch 
x zyklen ab, wobei x der servostellung entspricht. hier mein code, der 
servo schlägt ganz nach rechts aus, obwol er doch eigentlich in der 
Mittelstellung sein müsste oder?

hier das Beispiel
#include <stdint.h>
#include <avr/io.h> 
#include <avr/interrupt.h>


int8_t waiting, servo, tmp, servotmp;


//Interrupt Service Routine
ISR(TIMER0_COMP_vect)   // Sollte alle 0,1 ms per interrupt besucht werden
{

servo = 5;           // Servoposition zwischen 0 und 10

waiting++;

if(waiting == 200){

 PORTB |= (1 << 0);    /* setzt Bit 0 an PortB auf 1 */

  if(tmp <= 9){      // auf jeden Fall 1 ms warten
    tmp++;            // tmp für 1 ms warten
  waiting=199;      // für rücksprung in schleife
    servotmp=0;
  }else{
                      // jezt spezifische einstellung

  if(servotmp == servo){  // rücksprung
      PORTB &= ~(1 << 0);   /* loescht Bit 0 an PortB */
      waiting=0;  
    tmp=0;
  }else{
    servotmp++;  // Korigieren und nächsten zyklus abwarten
    waiting=199;
  }

  }
}

}

//Hauptprogramm

int main(void) {

//Pin Konfiguration
DDRB = 0xFF; //PORT B als Ausgang
  
//Timer 0 initialisieren 
TCNT0 = 0x00;          //Timer 0 mit Null initialisieren
OCR0  = 0x64;          //Vergleichsregister initialisieren (bis 100 zählen)
TIMSK = (1<<OCIE0);    //Output Compare interrupt enable
sei();                 //Enable Global Interrupt

//Timer Start                       für Taktfrequenz / 8
TCCR0 = ((1<<WGM01) | (1<<COM00) | (1<<CS01) |  (0<<CS00));
//         CTC Mode | Toggle OC0 | Prescaler clk/8
            
while(1==1){




};
  
return 0;
}

Autor: Peter Bünger (pbuenger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was mir aufgefallen ist: mit int8_t kannst Du nicht bis 200 zählen.

Gruß,
Peter

Autor: Sonke A. (soeni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das geht doch bis 255 oder??

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sönke Paschko wrote:
> das geht doch bis 255 oder??

Richtig

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint8_t geht bis 255
^
|

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja und? uint heißt nur das er auch ins negative gehen kann.
Wenn nicht bitte ich um Entschuldigung aber so hab ichs bisher immer 
gedacht.

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Robin Tönniges wrote:
> Ja und? uint heißt nur das er auch ins negative gehen kann.

Leider falsch.

int  == integer

uint == unsigned integer (ohne Vorzeichen / nur positiv)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.