www.mikrocontroller.net

Forum: Compiler & IDEs Inkrementalgeber


Autor: Christian Lllllllll (qgel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo

ich hab ein Programm das auch funktioniert aber leider nur mit einer 
Phase des Gebers, was bedeutet dass er mir wenn ich links drehe in den 
counter zählt und wenn ich rechts drehe auch, das will ich ändern. Da 
Phase_A 90° versetzt zu  Phase_B liegt kann ich doch sagen.

wenn Phase_A eine steigende Flanke UND Phase_B eine 0 hat,
dann zähle VOR
andernfalls zähle zurück

habe mal en stückchen programmiert weis aber nicht ob das so stimmt!
if (TCNT1 && (PIND & (1 << PD5)))
{count forward};
else {count backward};  

und hier mein jetziges Programm

//--- Includen ---



#include <avr/io.h>         
#include "lcd-routines.h" 
#include <util/delay.h> 



// --- Hauptprogramm --- 


void main(void) 
{
lcd_init();             


set_cursor(0,1);           
lcd_string("Winkelerfassung" );   


DDRD=0;                          
TCCR1B=0b01001110;               
OCR1A=3000;                     

// --- Berechnung und Ausgabe der Variablen ---


while (1)
{

uint16_t winkel = TCNT1*0.36;




char puffer_winkel[20];       

sprintf( puffer_winkel," %4d Grad", winkel );  


set_cursor(0,2);           
lcd_string( puffer_winkel );     
};

};

wäre euch dankbar wenn ihr mir weiterhelfen könnt, da ich noch Anfänger 
bin!

benutzt wird Atmega8
PortD - PIN5 --> Phase_A
PortD - PIN6 --> Phase B
gruß

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Drehgeber

Autor: qgel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hey ja habe ich schon geschaut sonst würde ich ja nicht schreiben dass 
ist alles bisschen anderes deswegen frag ich nach hilfe!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
qgel schrieb:
> hey ja habe ich schon geschaut sonst würde ich ja nicht schreiben dass
> ist alles bisschen anderes deswegen frag ich nach hilfe!

Dann schreib erstmal, was anders ist.
Das Beispiel deckt doch alle 3 Typen von Encodern ab.

Und wenn Du was anderes programmierst, dann mußt Du es auch beschreiben.
Dein Programm liest nirgends nen Encoder ein, sondern gibt den Timer 
aus.

Benutze den Anhang und schicke was compilierbares.

Peter

Autor: qgel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,

Ja im Moment lese ich nur einen Eingang ein und zähle die Impulse diese 
Rechne ich dann in Grad um.

Ich will aber dass wenn ich Rechts drehe ich vorzähle und wenn ich links 
drehe zurückzähle.

Ich verstehe wie ichs machen muss damit es klappt. aber ich kanns 
einfach nicht programmiern, weil ich noch Anfänger bin. Deswegen suche 
ich bei euch hilfe!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
qgel schrieb:
> Ich will aber dass wenn ich Rechts drehe ich vorzähle und wenn ich links
> drehe zurückzähle.

Du wirst es nicht für möglich halten, aber genau das macht der 
Beispielcode.
Es wäre auch ziemlich sinnfrei gewesen, ihn sonst zu posten.


> Ich verstehe wie ichs machen muss damit es klappt.

Nö, genau dabei haperts doch bei Dir.


> aber ich kanns
> einfach nicht programmiern, weil ich noch Anfänger bin.

Nicht weil Du ein Anfänger bist.
Du mußt zuerst wissen, was Du machen willst.
D.h. Du mußt in der Lage sein, verbal zu beschreiben, was Dein Programm 
tun soll (Programmablaufpan).
Man schreibt Programme nicht einfach irgendwie drauflos.


> Deswegen suche
> ich bei euch hilfe!

Dann nimm die bereits gegebene Hilfe einfach mal an.


Peter

Autor: Christian Lllllllll (qgel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo peter

ok habe deinen Code benutzt, nur er funktioniert nicht, wahrscheinlich 
da er für atmega 16 geschrieben ist und ich atmega8 habe!

wenn ich ihn mit AVR Studio in .hex wandeln will kommen 5 errors...
  TCCR0 = 1<<WGM01^1<<CS01^1<<CS00;    // CTC, XTAL / 64
  OCR0 = (uint8_t)(XTAL / 64.0 * 1e-3 - 0.5);  // 1ms
  TIMSK |= 1<<OCIE0;

alle hier in diesem Ausschnitt, das versteht wohl der atmega 8 nicht !


vl kannst du mir helfen das zu ändern damits beim atmega8 auch klappt!


gru´ß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Böhr schrieb:
> hallo peter
>
> ok habe deinen Code benutzt, nur er funktioniert nicht, wahrscheinlich
> da er für atmega 16 geschrieben ist und ich atmega8 habe!

Das kann sein.

> vl kannst du mir helfen das zu ändern damits beim atmega8 auch klappt!

Du musst lernen, dass unterschiedliche Prozessoren unterschiedliche 
Fähigkeiten haben. Zb. kann der Mega16 am Timer0 einen CTC Betrieb 
durchführen, der Mega8 aber nicht.

Datenblatt der beiden Prozessoren bei Atmel besorgen und miteinander 
vergleichen. Zuerst suchst du im Datenblatt vom Mega16 die Beschreibung 
vom Timer0 und siehst nach, was da exakt mit den Konfigurationsbits 
eingestellt wird. Danach suchst du dir im Mega8 Datenblatt bei einem der 
3 vorhandenen Timer die äquivalente Funktionalität.

Und noch ein Hinweis: Ob der Interrupt jetzt exakt alle 1ms kommt, oder 
ob das alle 1.5 oder 2ms sind, ist bei der Abfrage von Tasten oder 
Encodern, die händisch betätigt werden, völlig egal. Bei Encodern wird 
das erst interessant, wenn sie von einem Motor angetrieben werden.
Für dich heißt das: Du könntest auch auf den CTC Modus pfeifen und den 
Interrupt von einem gewöhnlichen Overflow auslösen lassen.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
[Offtopic]
@Peter
TCCR0 = 1<<WGM01^1<<CS01^1<<CS00;    // CTC, XTAL / 64
Ist das EXOR wirklich Absicht hier, welchen Zweck erfüllt es, und wäre 
es nicht besser das einfacher zu schreiben, damit es auch Anfänger 
verstehen?
[/Offtopic]

Autor: Christian Lllllllll (qgel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo habe mir mal de Datenblätter durchgestöbert.

bei
  TCCR0 = 1<<CS01^1<<CS00;
habe ich nur das WGM01 weggemacht weil er das nicht erkennt und den CTC 
modus nicht gebraucht wird wie schon einer sagte.

bei
  TIMSK |= 1<<T0IE0;
 denke ich das das register hinkommt!


also ich versteht da garnix...sorry aber helft mir bitte...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Lllllllll schrieb:

> also ich versteht da garnix...

Dann wirds Zeit.

> sorry aber helft mir bitte...

Was genau verstehst du denn nicht?
Wie ein Timer arbeitet?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm.
Hab gerade gesehen, dass es im gcc-Tutorial keinen Abschnitt über Timer 
gibt.

Aber du könntest dir einfach mal den Timer-Abschnitt im Assmbler Tuorial 
durchlesen. Da ist beschrieben, wie ein Timer grundsätzlich arbeitet.
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Timer

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine gute Hilfe wäre vielleicht:
1. Grundlagen von C anstämdig zu lernen
2. das AVR-Tutorial durchzuackern
3. Fragen, wenn dann etwas nicht selbst lösbar ist.

Wenn hier jeder sich alles vorkauen lässt, der das Handwerkszeug
nicht beherrscht und kein Datenbalatt selber anschauen will, haben
die Leute hier viel zu tun.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Lllllllll schrieb:
> also ich versteht da garnix...sorry aber helft mir bitte...

D.h. Du hast Dich noch nicht mit dem AVR beschäftigt.

Dann fang erstmal klein an, bring mit nem Timerinterrupt eine LED zum 
Blinken (1ms Interrupt + Variable bis 1000 zählen lassen).


Peter

Autor: Christian Lllllllll (qgel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie ich das in atmega8 wandeln soll...
  TCCR0 = 1<<WGM01^1<<CS01^1<<CS00;    // CTC, XTAL / 64
  OCR0 = (uint8_t)(XTAL / 64.0 * 1e-3 - 0.5);  // 1ms
  TIMSK |= 1<<OCIE0;

ich habe rausgefunden das es die Register TCCRO und TIMSK auch bei 
atmega8 gibt! dennnoch verstehe ich überhaupt nicht wie ich das dann 
hinschreiben soll. CS01 und CS00 gibts auch aber Rest zb nicht!

was bedeutet überhaupt 1<< oder ^1

Autor: Christian Lllllllll (qgel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define PHASE_A    (PIND & 1<<PD1)
#define PHASE_B    (PIND & 1<<PD3)

beudeutet das das Phase_A auf dem PD1 am Atmega8 als eingang ist?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Lllllllll schrieb:
> wie ich das in atmega8 wandeln soll...
>
>
  TCCR0 = 1<<WGM01^1<<CS01^1<<CS00;    // CTC, XTAL / 64
>   OCR0 = (uint8_t)(XTAL / 64.0 * 1e-3 - 0.5);  // 1ms
>   TIMSK |= 1<<OCIE0;
> 

siehe Beitrag "Re: Inkrementalgeber"

>
> ich habe rausgefunden das es die Register TCCRO und TIMSK auch bei
> atmega8 gibt! dennnoch verstehe ich überhaupt nicht wie ich das dann
> hinschreiben soll. CS01 und CS00 gibts auch aber Rest zb nicht!
>
> was bedeutet überhaupt 1<< oder ^1

siehe Beitrag "Re: Inkrementalgeber"

Autor: Christian Lllllllll (qgel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
immer das selbe , ich schlag mich schon seit einem Monat damit rum und 
immer bekomme ich Links geschickt die mich nicht weiterbringen anstatt 
einer von euch mir mal sagt wie es richtig heißt!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Lllllllll schrieb:
> immer das selbe , ich schlag mich schon seit einem Monat damit rum

Warum liest du dann nicht einfach mal ein paar Tutorien durch?

Nach einem Monat erkennst du die << Schreibweise um ein 1 Bit mit einem 
bestimmten Namen auszudrücken immer noch nicht? Das hiesige Tutorial, 
unzählige Forenbeiträge, sind voll davon!

Und die Fragestellung, was denn ^1 bedeutet, zeigt eigentlich nur, dass 
du immer noch keine Literatur zum Thema C-Progammierung für Anfänger 
durchgearbeitet hast. Sonst würdest du den Begriff 
Operatoren-Reihenfolge und was er bedeutet kennen und selbst wenn du die 
Tabelle der Reihenfolge nicht auswendig kennst, wüsstest du, wo du 
nachschauen musst um rauszufinden, wie 1<<A^1<<B gruppiert wird (Hint: 
es ist (1<<A) ^ (1<<B))

Auch wenn du es nicht glauben willst: Die Methode 'Versuch und Irrtum' 
funktioniert bei einer Programmiersprache nicht, bzw. erst dann, wenn 
man schon mindestens eine ähnliche Sprache beherrscht und relativ gut 
ist. Und die Aussage 'Ich lerne am besten, wenn mir jemand den Code 
vorkaut, am besten gleich so dass ich ihn 100% für mein Problem benutzen 
kann', ist eine müde Ausrede für 'Ich will meine Arbeit eigentlich nicht 
selber machen, kann mir das bitte mal jemand abnehmen'.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ich schlag mich schon seit einem Monat damit rum
Andere tun das seit Jahren ...
... und werden doch noch ab und zu überrascht   :-o

> immer das selbe
Um es kurz zu machen: du kannst nicht mit dem Counter eines AVRs 
direkt die Position eines Quadraturencoders einlesen.

> immer das selbe
Lernen mußt du selber  :-/

BTW
Kompliment, das hat Niveau:
  uint16_t winkel = TCNT1*0.36;
Du weißt schon, was du da tust?
Wesentlich besser wäre die Verwendung von Festkommaarithmetik

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Hmm.
> Hab gerade gesehen, dass es im gcc-Tutorial keinen Abschnitt über Timer
> gibt.

Doch, gibt(gab) es, nur hat da jemand kürzlich Teile des GCC-Tutorial in 
separate Artikel ausgelagert.
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Ernst schrieb:
> Karl heinz Buchegger schrieb:
>> Hmm.
>> Hab gerade gesehen, dass es im gcc-Tutorial keinen Abschnitt über Timer
>> gibt.
>
> Doch, gibt(gab) es, nur hat da jemand kürzlich Teile des GCC-Tutorial in
> separate Artikel ausgelagert.
> 
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Ah. ok
Kam mir gleich so seltsam vor, dass es keinen Abschnitt über Timer gibt.
Ich habe ins Tutorial einen Verweis auf diese Seite eingebaut, damit er 
nicht verloren geht.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:

> Ich habe ins Tutorial einen Verweis auf diese Seite eingebaut, damit er
> nicht verloren geht.

Die ausgelagerten Artikel stehen ganz unten als "Siehe auch".

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Ernst schrieb:
> Karl heinz Buchegger schrieb:
>
>> Ich habe ins Tutorial einen Verweis auf diese Seite eingebaut, damit er
>> nicht verloren geht.
>
> Die ausgelagerten Artikel stehen ganz unten als "Siehe auch".

Hand aufs Herz:
Wer sieht da nach?
Ich habe auch nur einen Blick ins Inhaltsverzeichnis geworfen und nach 
einem Abschnitt über Timer gesucht.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Stefan Ernst schrieb:
>> Karl heinz Buchegger schrieb:
>>
>>> Ich habe ins Tutorial einen Verweis auf diese Seite eingebaut, damit er
>>> nicht verloren geht.
>>
>> Die ausgelagerten Artikel stehen ganz unten als "Siehe auch".
>
> Hand aufs Herz:
> Wer sieht da nach?
> Ich habe auch nur einen Blick ins Inhaltsverzeichnis geworfen und nach
> einem Abschnitt über Timer gesucht.

Das sollte auch keine "Wertung" sein. ;-)
Ich wollte dich nur darauf hinweisen, wo du die anderen Sachen findest.

Ich hätte es auch besser gefunden, wenn der "Auslagerer" das 
Inhaltsverzeichnis intakt gelassen und einfach den Text durch einen Link 
ersetzt hätte.

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.