mikrocontroller.net

Forum: Compiler & IDEs Datenrichtungsregister auswerten, aber einfacher!


Autor: spence (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich gebe zu, dass c neuland für mich ist und ich früher nur mit bascom 
(schande über mich) gecodet habe. mein erstes programm wertet das ddrx 
aus und gibt diese auf dem lcd aus, z.b. EAEEAEAA. mein jetziger code 
ist mir jedoch zu groß und unhandlich. kann man folgendes noch 
vereinfachen?

int checkddrx(void){

if(DDRD& (1<<PD0)){
lcd_gotoxy(7,2);
lcd_puts("A");
}
else {
lcd_gotoxy(7,2);
lcd_puts("E");
}


if(DDRD& (1<<PD1)){
lcd_gotoxy(8,2);
lcd_puts("A");
}
else {
lcd_gotoxy(8,2);
lcd_puts("E");
}

usw...

}

mfg
spence

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PD0 bis PD7 sind bloß Konstanten mit dem Werten von 0 bis 7. Du kannst 
also auch eine Schleife für alle acht Bits laufen lassen, und dann mit 
(1<<i) die einzelnen Bits abfragen.

Autor: spence (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm eigentlich müsste doch der folgende code funktionieren (ich seh 
jedenfalls keinen grund, warum nicht.) und dennoch kommt auf dem lcd 
garnix.
int checkddrx(void){
int dz  = 1;                 /* Durchlaufzähler */
int gt = 7;                 /* zeichen nummer */
while (dz >= 7)             /* Wenn dz = 7 dann hör auf */
{
if(DDRD& (1<<dz)){
lcd_gotoxy(gt,2);
lcd_puts("A");
}
else {
lcd_gotoxy(gt,2);
lcd_puts("E");
}
dz  += 1;                 /* +1 */
gt  += 1;
}
}

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> int dz  = 1;                 /* Durchlaufzähler */
> ...
> while (dz >= 7)             /* Wenn dz = 7 dann hör auf */
> ...

Die while-Schleife wird so lange ausgeführt, wie die Bedingung wahr 
ist. In diesem Beispiel also 0-mal.

Ist es Absicht, dass du den Inhalt des Registers quasi in umgekehrter 
Reihenfolge ausgibst, also LSB...MSB?

Hier mein Vorschlag (aber in der Reihenfolge MSB...LSB):
int i;
for (i=0;i<8;i++) {
  lcd_gotoxy(14-i,2);
  if (DDRD&&(1<<i))
    lcd_puts("A");
  else
    lcd_puts("E");
}


PS: Du solltest dir unbedingt Einrückungen angewöhnen.

Autor: spence (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen herzlichen dank erstmal für den codefetzen! gleich ausprobiert 
und siehe da: ich habe EEEEEEEE auf dem LCD. freu. jetzt hab ich mal 
DDRD nach 0xAA geändert, was zufolge haben müsste, dass EAEAEAEA 
angezeigt werden sollte. tut es jedoch nicht. stattdessen: AAAAAAAA. bin 
gerade noch am grübeln, woran es liegen könnte.

Autor: spence (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab ihn gefunden!
if (DDRD&&(1<<i)) <--- ein "&" weniger, und es funzt!


vielen dank!!!

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, ja, sorry, kleiner Flüchtigkeitsfehler. :)

Autor: spence (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kein thema! hab ja dabei noch wat gelernt und so solls ja auch sein :)

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du gerade am wat lernen bist:
  unsigned char p;
  lcd_gotoxy(7, 2);
  for(p=0x80; p; p>>=1)
    lcd_putc(DDRD&p ? 'A' : 'E');

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.