Forum: Compiler & IDEs Inkrementalgeber


von Christian L. (qgel)


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!
1
if (TCNT1 && (PIND & (1 << PD5)))
2
{count forward};
3
else {count backward};

und hier mein jetziges Programm
1
//--- Includen ---
2
3
4
5
#include <avr/io.h>         
6
#include "lcd-routines.h" 
7
#include <util/delay.h> 
8
9
10
11
// --- Hauptprogramm --- 
12
13
14
void main(void) 
15
{
16
lcd_init();             
17
18
19
set_cursor(0,1);           
20
lcd_string("Winkelerfassung" );   
21
22
23
DDRD=0;                          
24
TCCR1B=0b01001110;               
25
OCR1A=3000;                     
26
27
// --- Berechnung und Ausgabe der Variablen ---
28
29
30
while (1)
31
{
32
33
uint16_t winkel = TCNT1*0.36;
34
35
36
37
38
char puffer_winkel[20];       
39
40
sprintf( puffer_winkel," %4d Grad", winkel );  
41
42
43
set_cursor(0,2);           
44
lcd_string( puffer_winkel );     
45
};
46
47
};

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ß

von Falk B. (falk)


Lesenswert?

Siehe Drehgeber

von qgel (Gast)


Lesenswert?

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

von Peter D. (peda)


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

von qgel (Gast)


Angehängte Dateien:

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!

von Peter D. (peda)


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

von Christian L. (qgel)


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...
1
  TCCR0 = 1<<WGM01^1<<CS01^1<<CS00;    // CTC, XTAL / 64
2
  OCR0 = (uint8_t)(XTAL / 64.0 * 1e-3 - 0.5);  // 1ms
3
  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´ß

von Karl H. (kbuchegg)


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.

von Benedikt K. (benedikt)


Lesenswert?

[Offtopic]
@Peter
1
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]

von Christian L. (qgel)


Lesenswert?

hallo habe mir mal de Datenblätter durchgestöbert.

bei
1
  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
1
  TIMSK |= 1<<T0IE0;
 denke ich das das register hinkommt!


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

von Karl H. (kbuchegg)


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?

von Karl H. (kbuchegg)


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

von Klaus W. (mfgkw)


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.

von Peter D. (peda)


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

von Christian L. (qgel)


Lesenswert?

wie ich das in atmega8 wandeln soll...
1
  TCCR0 = 1<<WGM01^1<<CS01^1<<CS00;    // CTC, XTAL / 64
2
  OCR0 = (uint8_t)(XTAL / 64.0 * 1e-3 - 0.5);  // 1ms
3
  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

von Christian L. (qgel)


Lesenswert?

1
#define PHASE_A    (PIND & 1<<PD1)
2
#define PHASE_B    (PIND & 1<<PD3)

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

von Klaus W. (mfgkw)


Lesenswert?

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

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"

von Christian L. (qgel)


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!

von Karl H. (kbuchegg)


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'.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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:
1
  uint16_t winkel = TCNT1*0.36;
Du weißt schon, was du da tust?
Wesentlich besser wäre die Verwendung von Festkommaarithmetik

von Stefan E. (sternst)


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-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR

von Karl H. (kbuchegg)


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-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR

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.

von Stefan E. (sternst)


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".

von Karl H. (kbuchegg)


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.

von Stefan E. (sternst)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.