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
{countforward};
3
else{countbackward};
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
voidmain(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_twinkel=TCNT1*0.36;
34
35
36
37
38
charpuffer_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ß
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
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!
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
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´ß
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.
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]
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?
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
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.
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
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
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"
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!
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'.
> 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 selbeLernen mußt du selber :-/
BTW
Kompliment, das hat Niveau:
1
uint16_twinkel=TCNT1*0.36;
Du weißt schon, was du da tust?
Wesentlich besser wäre die Verwendung von Festkommaarithmetik
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.
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".
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.
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.