Forum: FPGA, VHDL & Co. Zufallsgenerator beim AT90S4433


von Florian Goldschmidt (Gast)


Lesenswert?

Hallo,
Ich möchte gerne per Zufall die Ausgänge PB0 bis PB3 per Zufall
schalten; Also:

PB0 ein oder PB1 ein
und
PB2 ein oder PB3 ein

Eine zweite Frage möchte ich hier gleich anschließen: Wie mache ich
eine Pause? Die Ausgänge sollen nämlich für einige Sekunden so bleiben
und dann wechseln. In einer Schleife eigentlich kein Problem, hoffe
ich.

Danke schonmal

Gruß Florian

von Dirk (Gast)


Lesenswert?

Hi,

du koenntest ein (oder mehrere) ADC Input nehmen und das rauschen einer
Diode messen.

Die Pause kannst du ueber eine Zeilerschleife machen. Besser waere es
natuerlich dafuer nen Timer zumissbrauchen z.B. Timer0 im Overflow
Betrieb.

Gruß,

Dirk

von Florian Goldschmidt (Gast)


Lesenswert?

öhm, also ich hatte mich ja schon damit abgefunden dass Assembler nicht
so einfach zu verstehen ist wie Visual Basic :P , aber immerhin
verstehe ich den Beispiel-Code im Tutorial (zumindest bis Teil 2.
IO-Grundlagen )...

Allerdings habe ich keine Ahnung was du mir zu sagen versuchst :-/

von Rolf Magnus (Gast)


Lesenswert?

Für lange Delays ist der Watchdog-Timer ein gutes Missbrauchsobjekt.
Mein allererstes Mikrocontrollerprogramm war eins, das zwei LEDs hat
wechselblinken lassen. Dazu hatte ich den Watchdog-Timer auf 0,25s
Timeout gestellt und in dessen Interrupt-Handler die LEDs getoggelt. In
der Hauptschleife hab ich den Controller einfach schlafen gelegt ;-)

von Florian Goldschmidt (Gast)


Lesenswert?

@rolf

Hast du dieses Programm noch (sagen wir mit zwei LED's An PB0 und PB1)
?
Ich hab hier eins, aber das funktioniert nicht.


.include "4433def.inc"

  ldi r16, 50
  ldi r17, 0xFF
  out DDRB, r17
loop1:

  if1:
    cpi r16, 100
    brne else1
    ldi r17, 0b00000001
    out PORTB, r17
    ldi r16, 50
    rjmp endif1
  else1:
    ldi r17, 0b00000010
    out PORTB, r17
    ldi r16, 100
  endif1:

  ldi r17, 255
  while1:
    subi r17, 1
    breq endwhile1
    nop
    rjmp while1
  endwhile1:
  rjmp loop1

von Rolf Magnus (Gast)


Angehängte Dateien:

Lesenswert?

Naja, ich hab mal kurz in das Datenblatt deines Controllers geschaut und
gesehen, daß der mit meinem Programm nicht laufen wird, da der
Watchdog-Timer keinen eigenen Interrupt hat. Meins ist halt für einen
ATtiny13 gedacht. Ich hab's trotzdem mal angehängt. Man könnte es ja
so modifizieren, daß es einen normalen Timer verwendet.

Schauen wir uns mal dein Programm an.

> .include "4433def.inc"
>
>   ldi r16, 50
>   ldi r17, 0xFF

Einfacher:

    ser r17

>   out DDRB, r17
> loop1:
>
>   if1:
>     cpi r16, 100
>     brne else1
>     ldi r17, 0b00000001

     ldi r17, (1 << PORTB0)

>    out PORTB, r17
>     ldi r16, 50
>     rjmp endif1
>   else1:
>     ldi r17, 0b00000010

     ldi r17, (1 << PORTB1)

>     out PORTB, r17
>     ldi r16, 100
>   endif1:
>

Generell dürfte dein Programm vermutlich einfach viel zu schnell
ablaufen. Schauen wir uns mal die Dauer der Warteschleife an:

>   ldi r17, 255
>   while1:
>     subi r17, 1

1 Taktzyklus

>     breq endwhile1

1 Taktzyklus, wenn false, sonst 2

>     nop

1 Taktzyklus

>     rjmp while1

2 Taktzyklen

Macht also 5 Taktzyklen pro Schleifendurchlauf. Die für das ldi und der
zusätzliche für den breq am Ende vernachlässigen wir mal.
 Bei 255 Schleifendurchläufen macht das 1275 Taktzyklen. Ich weiß
nicht, bei welchem Takt du den Controller betreibst, aber bei 1MHz wäre
deine Warteschleife in gut 1,2 Millisekunden fertig. Deine LEDs würden
also mit einer Frequenz von über 400 Hz wechselblinken. Falls dein Takt
höher ist, natürlich entsprechend schneller.
Entweder mußt du auf Timer ausweichen, oder du mußt deine Warteschleife
auf einen 16bittigen Schleifenzähler erweitern, um genug Zeit
kaputtzumachen, damit die Blinkgeschwindigkeit für Menschen wahrnehmbar
wird.

>   endwhile1:
>   rjmp loop1

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.