Genau der restZitat von BlackDevil
![]()
Hi,
leider ist mir nicht klar, was "der Rest" ist -- was genau möchtest Du fragen?Zitat von BlackDevil
Zu einer Deiner Fragen oben: Die if-Anweisung sorgt dafür, dass der Port, wenn er == 0 ist, wieder auf 1 gesetzt wird, damit überhaupt ein Bit zum Shiften da ist.
Gruß
Fred
Only entropy comes easy. - Anton Checkhov
Genau der restZitat von BlackDevil
![]()
Hi,
1. die Sache mit der Variablen "run" ist jetzt OK, oder?
2. welche LCD-Bibliothek benutzt Du? Die dazu passende "lcd.h" musst Du einbinden. Welche das ist, kann ich ohne mehr Informationen nicht erraten. Ganz oben hast Du geschrieben, dass Du allen Code im AVRStudio simulierst. Für eine LCD-Ansteuerung würde ich einiges an Hardware-Aufwand erwarten; simulieren lässt sich das nur sehr schwer.
Habe ich das was missverstanden?
Gruß
Fred
Only entropy comes easy. - Anton Checkhov
Nein du hast nichts Missverstanden. Die Variable run will nicht, wie ich Prüfe ob sie 1 oder ist habe ich oben gepostet. So wie ich es eingebunden habe (run==1) funktioniert es nicht.
Das AVRSTudio bietet das einbinden von LCDs, bzw das Simulieren, mit einem Zusatztool (zumindest soweit ich das verstanden habe). Nennt sich dann AVR LCD (Editor).
Selbst wenn es nicht geht - macht nichts. Welche lcd.h ich Verwende? Gar keine - muss man sich die immer je nach LCD selbst zusammen Schustern oder gibts eine Grundlage auf der ich nur den Chip auf dem LCD sowie dessen größe verändern muss? Wenn es so eine gibt fand ich sie bisweilen noch nicht.
http://www.ulrichradig.de/site/infos...rogramming.pdf
Spricht etwas dagegen statt PORTA |= (1<<PINA1), outp (0x04, PORTB); (wenn ich da richtig liege ... ) schreiben? Ich finde dieses etwas elleganter und da die Funktionen vom AVR Studio geliefert werden...
Tut mir leid wenn ich bei sowas nicht immer MrSuperverständlich bin, bin leider nicht so der Riesen Erklärbär ...
Übrigens: Oben schriebe jemand mein Code "sei nicht C Typisch". Warum?
"PORTB <<= 1;" ist das gleiche wie "PORTB = PORTB << 1;".Gibts noch eine Erklärung dazu wie nun der Port durchgeshiftet wird um zu Prüfen ob ein Pin1 ist oder die Register zu setzen?
Dabei wird erstmal der aktuelle Wert aus dem Register PORTB gelesen, dann dieser Wert um eine Stelle nach links geschoben (links fällt dabei ein Bit raus, rechts wird eine 0 nachgeschoben) und der geänderte Wert wird zurück in das Register geschrieben. Nach 8 Schleifendurchläufen ist die 1 links rausgefallen (PORTB ist dann also 0) und das if sorgt dann dafür, dass ganz rechts wieder eine 1 reingeschrieben wird.
MfG
Stefan
Hi,
und Du bist Dir ganz sicher, dass Du jetzt <pre>uint8_t run=PINA&(1<<PINA0);</pre> geschrieben hast? Dann muss "run" funktionieren, wenn Du Bit0 setzt (in Deiner ursprünglichen Code-Variante hattest Du , glaube ich, mit Bit 1 gearbeitet).Zitat von BlackDevil
OK, davon hatte ich schon peripher mal etwas gehört, habe aber keinerlei Erfahrung damit.Das AVRSTudio bietet das einbinden von LCDs, bzw das Simulieren, mit einem Zusatztool (zumindest soweit ich das verstanden habe). Nennt sich dann AVR LCD (Editor).
Bin mir nicht sicher, dass die alten "outp()" Funktionen bei den neueren GCC Versionen noch unterstützt werden. Die erste Variante ist die übliche. PORTA liegt an der Adresse 0x1B, also sind die beiden Ausdrücke nicht äquivalent.Spricht etwas dagegen statt PORTA |= (1<<PINA1), outp (0x04, PORTB); (wenn ich da richtig liege ... ) schreiben?
Gruß
Fred
Only entropy comes easy. - Anton Checkhov
Danke - ist also Quasi wie ein Schieberegister/Multiplexer. Den würde man ja Ähnlich Programmieren.Zitat von sternst
Das die beiden nicht Äquivalent sind liegt allein schon daran das in der einen Version PORTA und PINA angesprochen wird und bei der zweiten Variante PORTB ... geht nur um die generelle Funktion. Werde auch das nachher einfach mal ausprobieren... Finde das etwas Eingänglicher als mit den BitoperatorenZitat von fhs
Danke
So besser? Wenn ich die Variablen mit <pre>#define</pre> Deklariere, funktioniert alles wunderbar. Wenn ich es hingegegen mit <pre>uint8_t</pre> mache Funktioniert es nicht. Genauso: Schreibe ich statt <pre> if((run_rwd)&&(auswahl=='f')) auswahl='r';</pre> dieses <pre> if((run_rwd==1)&&(auswahl=='f')) auswahl='r';</pre> Funktioniert das Rückwärts Shiften auch nicht. Er ändert die Variable dann nicht. Bei <pre>run_fwd</pre> ist es egal wie ichs mach ^^ Irgendwie ... weis nich.Code:#include <avr/io.h> #include <stdint.h> #include <util/delay.h> #define run_fwd (PINA&(1<<PA0)) // Start/Stop #define run_rwd (PINA&(1<<PA1)) // Vorwärts/Rückwärts #define DDR_LED DDRB // PORTB (LED) #define DDR_INP DDRA // PORTA (Taster) #define p_INP PORTA // PORTA für Taster void fwd(){ // Vorwärts PORTB<<=1; if(!PORTB) PORTB=1; } void rwd(){ // Rückwärts PORTB>>=1; if(!PORTB) PORTB=128; } int main (void) { DDR_LED = 0xff; // Ausgänge EIN für LED DDR_INP = 0x00; // Eingänge EIN für Taster p_INP = 0xFF; // PullUp EIN char auswahl='s'; // Default while(1) { // MAINSCHLEIFE if((run_rwd)&&(auswahl=='f')) auswahl='r'; // Run RWD, war FWD else if((run_rwd)&&(auswahl=='r')) auswahl='f'; // Run FWD, war RWD else if((run_fwd==1)&&(auswahl=='f')) auswahl='x'; // Stop FWD, war FWD else if((run_fwd==1)&&(auswahl=='r')) auswahl='y'; // Stop RWD, war RWD switch(auswahl){ case 'f': // VORWÄRTS FWD fwd(); break; case 'r' : // RÜCKWÄRTS RWD rwd(); break; case 'x' : // STOP FWD, setze danach FWD (war FWD) loop_until_bit_is_set(PINA, PA0); auswahl='f'; break; case 'y' : // STOP RWD, setzte danach RWD (war RWD) loop_until_bit_is_set(PINA, PA0); auswahl='r'; break; case 's' : // Default Stop, Start drücken zum Starten loop_until_bit_is_set(PINA, PA0); auswahl='f'; break; } } // MAINSCHLEIFEN ENDE return 0; }
Das AVR Studio bietet dort ein kleines Kuriosum. Genauso wie <pre>_delay_ms(>10)</pre> nicht Funktioniert. Er Springt dann in der delay.h rum, macht aber nichts. Ergo kann ich auch keine debounce Funktion einbauen, bzw den "vorgekauten" Code benutzen.
Ich hoffe auf Lösung und verbleibe mit Freundlichen Grüßen![]()
Hallo,
Was bei Dir funktioniert, ist eine Präprozessor-Anweisung, keine Variablen-Deklaration oder -Definition! Bitte ein (möglichst kurzes, aber kompilierbares!) Beispiel für das, was nicht funktioniert. Vermutlich zeigt Dir mein nächster Absatz aber schon das Problem:... Wenn ich die Variablen mit <pre>#define</pre> Deklariere, funktioniert alles wunderbar. Wenn ich es hingegegen mit <pre>uint8_t</pre> mache Funktioniert es nicht.
Schreibe ich statt <pre> if((run_rwd)&&(auswahl=='f')) auswahl='r';</pre> dieses <pre> if((run_rwd==1)&&(auswahl=='f')) auswahl='r';</pre> Funktioniert das Rückwärts Shiften auch nicht.
- 1. Soweit ich mich erinnere, ist in (Standard-)C "unwahr" als "0" definiert; jeder andere Wert ist "wahr"; allerdings ist der Compiler angehalten, für "wahr" eine "1" zu setzen, wenn er selbst einen Vergleich durchführt.
2. Welches Bit ist denn in run_rwd möglicherweise gesetzt? Antwort: Bit1 (nämlich 1<<PA1) --- nicht Bit0! Also darfst Du nicht mit "1", sondern musst mit "2" vergleichen:Das hatte ich in einem früheren Posting gemeint, als ich schrieb, Du hättest ja ursprünglich mit Bit1 verglichen.Code:if((run_rwd==2)&&(auswahl=='f')) auswahl='r';
Das ist die Problematik, wenn man Werte anstelle von logischen Typen benutzt.
if((run_rwd)&&(auswahl=='f')) ist aber völlig in Ordnung!
Setze Dich doch auch einmal mit dem Datentyp "bool" auseinander. Wenn Du "bool" verwendest, muss <pre>#include <stdbool.h></pre> eingebunden werden.
Viele Grüße
Fred
Only entropy comes easy. - Anton Checkhov
Hi
Ich weis das ich mit <pre>#define</pre> eine Präprozessor Anweisung keine Deklaration vornehme. Ergo ist das ganze dann nur eine andere Bezeichnung für etwas (grob). Funktioniert aber.
Ich hatte gedacht das <pre>PINA&(1<<PAX) </pre> eine 1 zurück gibt wenn PAX gesetzt ist ...also Bool'sch ist - genauso mit uint8_t . <pre>bool VAR = PINA&PAX</pre> kann ich dann nich machen oder?
Das mit der zwei macht sinn ... Das register ist ja <pre>0x00</pre> oder <pre>00000000</pre> - damit wäre ein setzen von Bit 2 <pre>0x02</pre> oder <pre>00000010=2</pre>
Macht sinn ... Entsprechend hätte ich beim setzen von Bit5 die Zahl 00010000 oder 0x10. Daran hab ich nich gedacht
DankeIrgendwie steh ich da noch etwas auf dem schlauch - find das Tut auch nich so prall *duck*
Gibts noch generelle Kritik an meinem stück code obeN?
Lesezeichen