- fchao-Sinus-Wechselrichter AliExpress         
Seite 3 von 5 ErsteErste 12345 LetzteLetzte
Ergebnis 21 bis 30 von 45

Thema: Mein erster Code auf dem Mega 32: Lauflicht

  1. #21
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    70
    Beiträge
    622
    Anzeige

    E-Bike
    Hi,
    Zitat Zitat von BlackDevil
    ...damit bleibt der rest aber noch offen.
    leider ist mir nicht klar, was "der Rest" ist -- was genau möchtest Du fragen?
    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

  2. #22
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    02.11.2005
    Beiträge
    1.614
    Zitat Zitat von BlackDevil
    Code:
    if((run==1)&&(auswahl=='n')){ auswahl='r';}
    Kann aber auch an einer Falschen einbindung liegen. 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?

    Woher bekomme ich die lcd.h? Ich hab gegooglet wie ein Ochse, ohne erfolg...
    Genau der rest

  3. #23
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    70
    Beiträge
    622
    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

  4. #24
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    02.11.2005
    Beiträge
    1.614
    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?

  5. #25
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    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?
    "PORTB <<= 1;" ist das gleiche wie "PORTB = PORTB << 1;".
    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

  6. #26
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    70
    Beiträge
    622
    Hi,

    Zitat Zitat von BlackDevil
    ...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.
    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).

    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).
    OK, davon hatte ich schon peripher mal etwas gehört, habe aber keinerlei Erfahrung damit.

    Spricht etwas dagegen statt PORTA |= (1<<PINA1), outp (0x04, PORTB); (wenn ich da richtig liege ... ) schreiben?
    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.

    Gruß

    Fred
    Only entropy comes easy. - Anton Checkhov

  7. #27
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    02.11.2005
    Beiträge
    1.614
    Zitat Zitat von sternst
    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?
    "PORTB <<= 1;" ist das gleiche wie "PORTB = PORTB << 1;".
    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.
    Danke - ist also Quasi wie ein Schieberegister/Multiplexer. Den würde man ja Ähnlich Programmieren.

    Zitat Zitat von fhs
    Hi,

    Zitat Zitat von BlackDevil
    ...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.
    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).
    Ich habe die Deklarationszeile mit Copy and Paste eingefügt... Ich machs nachher noch mal und poste den spaß

    Spricht etwas dagegen statt PORTA |= (1<<PINA1), outp (0x04, PORTB); (wenn ich da richtig liege ... ) schreiben?
    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.

    Gruß

    Fred
    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 Bitoperatoren

    Danke

  8. #28
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    02.11.2005
    Beiträge
    1.614
    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; 
    }
    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.
    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

  9. #29
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    70
    Beiträge
    622
    Hallo,

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

    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:
      Code:
      if((run_rwd==2)&&(auswahl=='f')) auswahl='r';
      Das hatte ich in einem früheren Posting gemeint, als ich schrieb, Du hättest ja ursprünglich mit Bit1 verglichen.
      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

  10. #30
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    02.11.2005
    Beiträge
    1.614
    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

    Danke Irgendwie 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?

Seite 3 von 5 ErsteErste 12345 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test