Forum: Mikrocontroller und Digitale Elektronik stk500 - zufälliges bitmuster


von Mike (Gast)


Lesenswert?

Hallo Zusammen,
wollte mal für den Stk500 ein miniprogramm in C schreiben, dass bei dem 
Tastendruck ein zufälliges Bitmuster auf den Leds ausgibt. Das Problem 
nun das ich habe ist, dass ich mit der Bedingung der while schleife 
nicht klarkomme. Arbeite mit eine Variablen, und bei jedem durchlauf der 
schleife wird der wert erhöht. Was aber nicht funktioniert ist die 
schleife. Die soll das zufällige bitmuster ausgeben, wenn ich eine Taste 
drücke. Mit while (PIND==0x01) geht das nicht. Mit Pind==0b11111110 geht 
das.hängt das mit diesem aktiv low zusammen? Bei den leds ist das ja so, 
dass durch eine 1 die Dinger ausgeschaltet sind und durch 0 ein. Wie ist 
es bei den tasten und wie stelle ich es an, dass erst beim loslassen der 
taste das muster angezeigt wird.
In maschinensprache habe ich es mit 0x01 hinbekommen, was die schleife 
anging. Deswegen kapier ich nicht, weshalb es in c anders ist also 1 und 
0 vertauscht

von syn_error (Gast)


Lesenswert?


von MIke (Gast)


Lesenswert?

Hallo,
danke, aber mir ging es um eine Widerspruch. Hier mal der Code in 
Assembler und in C.

-----------------------------
.include "m32def.inc"
  ldi r16, 0xff
  out DDRB, r16
  ldi r16, 0x00
  out DDRD, r16
  ldi r17, 0x00    // Zählvariable mit Startwert
loop:
  inc r17
  in r18, PIND
  andi r18, 0x01
  breq loop
  rjmp setze

  setze:
    out PORTB, r17
    in r18, PIND
    andi r18, 0xff
    brne setze
rjmp loop
-----------------------------

UNd in C

#include <avr/io.h>
#include <inttypes.h>
volatile uint8_t count;  // 8Bit Variable festlegen
int main()

  {
  DDRB=0xff;                      //Port B zu Ausgang
  PORTB=0x01;              //Port B high wegen LED´s active low
  DDRD=0x00;          //Port D zu Eingang
  count=0;

  while(1)
    {



      while(PIND!=0xff)                   {
                    }
      while(PIND==0xff)                  {
        count++;            // zählen
      }

      PORTB=count;    //ausgabe
    }
    ;
  return 0;
  }

Mir gehts nu darum, dass in C die Bedingung, falls die letzte Taste 
gedrückt wird lautet PIND!=0xff bzw. PIND==0xff und in Assembler das 
ganze lautet andi r18, 0x01, das verstehe ich deshalb nicht ganz. 0xff 
und 0x01 ist ja nicht dasselbe ...

von MIke (Gast)


Lesenswert?

Also habs jetzt selber hinbekommen, eventuell Assembler Code 
überarbeiten. eine kurze infofrage noch zu dem Code hier:



/* Mikroprozessor-Labor 1
Aufgabe 2: Zufallsgenerator in "C" */

#include <avr/io.h>

volatile uint8_t count; //globale Variable


int main (void) {

  DDRB = 0xff  ;    //DDRB als Ausgang definieren
  DDRD = 0x00  ;    //DDRD als Eingang definieren
  PORTB = 0b00000001;  // Alle Pins leuchten, bis auf das Erste (PB0)
  PORTD = 0xff; //Pullups einschalten ???
  count = 0;      // Zählvariable auf Null

  while (1) {
    while (PIND!=0b11111110){  // Tastendruck ist low (also bei Null)
    // warte auf Tastendruck
    }

    while (PIND==0b11111110){  // Tastendruck ist low (also bei Null)

     count++;

    }
    PORTB = count;

  }


return 0;
}



Muss ich da diese Pullups einschalten mit PORTD=0xff? Falls ja, warum 
funktioniert auch ohne.

von Hc Z. (mizch)


Lesenswert?

MIke schrieb:
> Muss ich da diese Pullups einschalten mit PORTD=0xff? Falls ja, warum
> funktioniert auch ohne.

Die Antwort findest Du, indem Du Dir die Beschaltung des Ports 
anschaust.  Laut der AVR-Studio-Hilfe, Abschnitt über STK500, Abschnitt 
"LEDs and Switches"->"Switches" tastet der Schalter gegen 0, ein 
externer Pullup ist bestückt.  Somit werden die internen nicht 
gebraucht, tun aber auch nicht weh.

Tipp:  Du könntest Dir Bitmanipulationen zu Gemüte führen.  Um den 
Zustand eines einzelnen Bits abzufragen, ANDet man mit der Wertigkeit 
des Bits und fragt dann auf != 0 (einzelner Schalte nicht gedrückt) oder 
== 0 (gedrückt) ab.  Das machst Du manchmal, manchmal aber testest Du 
alle Schalter gleichzeitig (und somit funktioniert Dein Programm nur, 
wenn die anderen auch wirklich alle in Ruheposition sind).

In Assembler gibt es übrgigens sbis und sbic, die sehr handlich zum 
Testen eines einzelnen Portbits sind.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.