Inkrementalgeber

#1426830
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ß
#1427557
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
Gast #1427670
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!
Angehängte Dateien:
#1427806
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
#1428000
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´ß
#1428001
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.
#1428033
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
#1428039
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"
#1428043
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'.
Moderator (Firma: Titel) Persönliche Seite #1428048
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
#1428128
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.
#1428166
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.
#1428182
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren