www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Zufallsgenerator beim AT90S4433


Autor: Florian Goldschmidt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Florian Goldschmidt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-/

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Florian Goldschmidt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

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]
  • [vhdl]VHDL-Code[/vhdl]
  • [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.