Forum: Mikrocontroller und Digitale Elektronik Problem Zufallsgenerator


von Seikuassi (Gast)


Lesenswert?

Hallo,

ich bin noch ein blutiger Anfänger in der Mikrocontrollertechnik. Ich 
habe jetzt mit AVR Studio 5.1 und meinem ATMEL Evaluationsboard 2.01 
mehrere kleine Assembler-Codes geschrieben und getestet, um eben zu 
sehen, wie der Mikrocontroller reagiert und was man damit eben alles so 
machen kann.

Ich habe zum Beispiel ein Zufallsgenerator geschrieben, der also von 
00-11 zählt (weil eben erstmal nur 2 LED´s auf dem Board sind). Wenn man 
aber Taster1 auf dem Board drückt, dann stoppt der Mikrocontroller mit 
der Zählung und zeigt die Zahl dann an (z.B. 11=3).
Klingt zwar einfach, doch als ich dann den umgekehrten "Effekt" haben 
wollte (sprich, wenn ich drücke zählt der Mikrocontroller durch und wenn 
ich eben nicht drücke, dann zeigt er mir die Zahl an), kam es zu einem 
merkwürdigen Problem:

Wenn ich drücke, dann oszilliert der µC brav durch, doch wenn ich die 
Taste1  nicht mehr drücke, dann gibt er immer die binäre Zahl 2 (=10) 
aus.
Das verstehe ich nicht...
Kann mir da jemand helfen?

Hier mal die beiden Codes. Der erste ist der funktionierende (nicht 
drücken=oszillieren) und unten der nicht funktionierende 
(drücken=oszillieren).
1
// "include"-Dateien laden
2
  .include "m32def.inc"
3
// Variablen deklarieren
4
  .def temp=r16
5
  .equ IPA=PINA
6
  .equ IPB=PINB
7
  .equ IPC=PINC
8
  .equ IPD=PIND
9
  .equ OPA=PORTA
10
  .equ OPB=PORTB
11
  .equ OPC=PORTC
12
  .equ OPD=PORTD
13
  .equ DRA=DDRA
14
  .equ DRB=DDRB
15
  .equ DRC=DDRC
16
  .equ DRD=DDRD
17
// Datenrichtungsregister definieren
18
  sbi DRD,5
19
  sbi DRD,6
20
  cbi DRD,2
21
// Hauptcode
22
  rjmp binaer0
23
  binaer0:
24
  cbi OPD,5
25
  cbi OPD,6
26
  sbis IPD,2
27
  rjmp binaer1
28
  rjmp binaer0
29
  binaer1:
30
  cbi OPD,5
31
  sbi OPD,6
32
  sbis IPD,2
33
  rjmp binaer2
34
  rjmp binaer1
35
  binaer2:
36
  sbi OPD,5
37
  cbi OPD,6
38
  sbis IPD,2
39
  rjmp binaer3
40
  rjmp binaer2
41
  binaer3:
42
  sbi OPD,5
43
  sbi OPD,6
44
  sbis IPD,2
45
  rjmp binaer0
46
  rjmp binaer3
-
1
// "include"-Dateien laden
2
  .include "m32def.inc"
3
// Variablen deklarieren
4
  .def temp=r16
5
  .equ IPA=PINA
6
  .equ IPB=PINB
7
  .equ IPC=PINC
8
  .equ IPD=PIND
9
  .equ OPA=PORTA
10
  .equ OPB=PORTB
11
  .equ OPC=PORTC
12
  .equ OPD=PORTD
13
  .equ DRA=DDRA
14
  .equ DRB=DDRB
15
  .equ DRC=DDRC
16
  .equ DRD=DDRD
17
// Datenrichtungsregister definieren
18
  sbi DRD,5
19
  sbi DRD,6
20
  cbi DRD,2
21
// Hauptcode
22
  rjmp binaer0
23
  binaer0:
24
  cbi OPD,5
25
  cbi OPD,6
26
  sbis IPD,2
27
  rjmp binaer0
28
  rjmp binaer1
29
  binaer1:
30
  cbi OPD,5
31
  sbi OPD,6
32
  sbis IPD,2
33
  rjmp binaer1
34
  rjmp binaer2
35
  binaer2:
36
  sbi OPD,5
37
  cbi OPD,6
38
  sbis IPD,2
39
  rjmp binaer2
40
  rjmp binaer3
41
  binaer3:
42
  sbi OPD,5
43
  sbi OPD,6
44
  sbis IPD,2
45
  rjmp binaer3
46
  rjmp binaer0

Vielen Dank im Voraus!

von Kartoffelbauer (Gast)


Lesenswert?

Definiere Zufall ;-)
zufällig bin ich hier über diesen thread gestolpert und empfehle mal 
ganz zufällig das tutorial durchzulesen/arbeiten.
http://www.mikrocontroller.net/articles/AVR-Tutorial

mfg

von Philipp Buchmann (Gast)


Lesenswert?

Mir ist schon klar, dass es dafür Tutorials gibt und ich den Code auch 
anders realisieren kann. Doch bis jetzt habe ich immer meine eigenen 
Fehler gefunden. Nur eben bei diesem Code noch nicht.

Später realisiere ich so eine Schaltung vllt. anders, aber jetzt würde 
ich gerne wissen, >>was an dem Code falsch ist<<. Mehr nicht.

Danke im Voraus!

von Zottel (Gast)


Lesenswert?

Das ist statischer Code. Wo soll der Zufall bleiben ? In diesem Code 
sicher nicht. Zieh dir mal die rueckgekoppelten Schieberegister rein :


Xilinx Application notes 210, 211, 217 & 220 ( XApp210.pdf, XApp211.pdf,
XApp217.pdf, XApp220.pdf )

zB
http://www.xilinx.com/support/documentation/application_notes/xapp210.pdf

von Philipp Buchmann (Gast)


Lesenswert?

Gut..ich gebe ja zu, dass das auf jeden Fall ein Pseudozufallsgenerator 
ist und das eben kein "wirklicher" Zufall entsteht. Doch bei einer 
Taktrate von 1 MHz kann kein Mensch in dem Moment drücken, wo er das 
auch will.

Es ist also kein realer Zufallsgenerator.

Trotzdem weiß ich noch immer nicht, warum der µC immer eine 2 (=10) 
ausgibt.
In der Theorie kann ich immer die selbe Zahl kriegen. Nicht aber in der 
Praxis.

Deswegen nochmal: Warum funktioniert der untere Code nicht (s. oben).

Danke im Voraus!

von Zottel (Gast)


Lesenswert?

Das Schieberegsiter ist auch statischer Code. Von dem weiss man aber wie 
er sich verhaelt. Ein 20bit Schieberesister wiederholt sich nach 2^20 = 
1 million bits. Mit 30 bit ist man bei einer Milliarde. In der genannten 
Appnote gibt's noch laengere.

von Zottel (Gast)


Lesenswert?

Ein Schalter prellt auch noch.

von Philipp Buchmann (Gast)


Lesenswert?

Stimmt. Denn wenn man nur einen Code hat, dann IST das ein PSEUDOZUFALL.
Man könnte nun aber auch sagen, wenn man einen Kondensator hat mit 
starker Selbstentladung und mithilfe des z.B. ADC-Wandlers die Spannung 
in einen Binärwert umwandelt und somit einen Zähler stoppt, der dann 
eine Zahl ausgibt, dass dies ein Zufallsgenerator sei.
Doch mit physikalischen Formeln kann man ja auch die Selbstentladung des 
Kondensators berechnen. Also ist auch die ein Pseudozufallsgenerator.
Und in der Theorie gibt es auf jeden Fall keine Zufälle.

Aber trotzdem wieder zurück zum Code:
Warum geht der zeite Code nicht bzw. warum gibt er IMMER 2 (=10) aus?

Danke im Voraus!

von Hmm (Gast)


Lesenswert?

Nun, wenn Du dieses unnütze Geraffel hier

  .equ IPA=PINA
  .equ IPB=PINB
  .equ IPC=PINC
  .equ IPD=PIND
  .equ OPA=PORTA
  .equ OPB=PORTB
  .equ OPC=PORTC
  .equ OPD=PORTD
  .equ DRA=DDRA
  .equ DRB=DDRB
  .equ DRC=DDRC
  .equ DRD=DDRD

mal rückgängig machst und dazu den Code noch ein wenig kommentierst, 
dann mache ich mir vielleicht die Mühe das mal anzuschauen. Und das 
einzige wofür sich wirklich equs gelohnt hätten, nämlich für die 5, 6 
und 2, hat keines. So ist es einfach Krampf.

Funktional im Moment nicht entscheidend aber dennoch wichtig für die 
Zukunft: Es fehlt die Initialisierung der ISR-Vektoren.

von Philipp Buchmann (Gast)


Lesenswert?

Alles klar!

Hier nun der "verbesserte" Code. Ich hoffe Ihr findet den Fehler...
1
  .include "m32def.inc"
2
  sbi DDRD,5
3
  sbi DDRD,6
4
  cbi DDRD,2
5
// Hier beginnt das Hauptprogramm
6
  rjmp binaer0
7
  binaer0:
8
  // binaere 0 laden
9
  cbi PORTD,5
10
  cbi PORTD,6
11
  // Wenn Taster1 gedrueckt, dann gehe zur naechsten Sprungmarke
12
  // ansonsten gehe zur aktuellen (binaer0) Sprungmarke
13
  sbis PIND,2
14
  rjmp binaer0
15
  rjmp binaer1
16
  binaer1:
17
  cbi PORTD,5
18
  sbi PORTD,6
19
  sbis PIND,2
20
  rjmp binaer1
21
  rjmp binaer2
22
  binaer2:
23
  sbi PORTD,5
24
  cbi PORTD,6
25
  sbis PIND,2
26
  rjmp binaer2
27
  rjmp binaer3
28
  binaer3:
29
  sbi PORTD,5
30
  sbi PORTD,6
31
  sbis PIND,2
32
  rjmp binaer3
33
  rjmp binaer0

von Philipp Buchmann (Gast)


Lesenswert?

2=PD2
5=PD5
6=PD6

von Hmm (Gast)


Lesenswert?

>Ich hoffe Ihr findet den Fehler...
Oh. Tut mir leid. Ich helfe Leuten nur den Fehler zu finden.

von Hmm (Gast)


Lesenswert?

Das hier kannst Du auch gleich mal rauslöschen. Ist überflüssig. Wenn 
dieser Befehl unmittelbar vor der angesprungenen Marke kommt, dann ist 
der Programmcounter ja schon da.
Näheres erklärt die Befehlsreferenz.

  rjmp binaer0
...
  rjmp binaer1
...
  rjmp binaer2
...
  rjmp binaer3

von Peter R. (pnu)


Lesenswert?

Zum Portd,2 , an dem die Taste angeschlossen ist:

Schau Dir nochmal an, wie solche eine Taste am Kontroller angeschlossen 
werden muss (Hardware).
-und was in der Software für diese Taste getan werden muss.

Begriffe dabei :  Eigenschaft offener Pins(ohne Beschaltung), 
Störsicherheit, pull-up.

von Philipp Buchmann (Gast)


Lesenswert?

Also ich habe als erstes den internen Pull-up aktiviert --> das gleiche 
Spiel.

Danach habe ich die Kondensatoren an den einzelnen Tastern auf dem ATMEL 
Evaluations-Board entfernt --> das gleiche Spiel.

An den internen Pull-up kann es also nicht liegen.

Wo liegt bloß der Fehler? Ist eurer Meinung nach der Code also richtig?

Danke im Voraus!

von Der (Gast)


Lesenswert?

Hi!

Die Frage ist gut gestellt. Gleich mit Source Code und verwendetem 
Board.
Mir gefällt auch, dass du was lernen möchtest.

Versuch das Programm mal folgendermaßen aufzubauen: Das Programm läuft 
wie bisher die ganze Zeit durch. Allerdings werden die Pins P5 und P6 
für die LEDs nur geändert wenn die Taste gedrückt ist. Falls sie nicht 
gedrückt ist, werden die Befehle für das Setzen der Pins übersprungen.

Gruß

von Der (Gast)


Lesenswert?

Nachtrag:

Ist das hier das besagte Board?
http://www.pollin.de/shop/downloads/D810074B.PDF
Falls ja, dann haben die Taster bereits einen Pull Down Widerstand 
(R7, R8, R11). Du solltest also die internen Pull Up Widerstände 
deaktivieren. Entweder nur Pull Up oder nur Pull Down, aber nicht beides 
gemischt.

Wenn der Taster gedrückt ist, dann sieht der Controller Low.
Wenn der Taster nicht gedrückt ist, dann sieht der Controller High.

Gruß

von Philipp Buchmann (Gast)


Lesenswert?

Der schrieb:
> Nachtrag:
>
> Ist das hier das besagte Board?
> http://www.pollin.de/shop/downloads/D810074B.PDF
> Falls ja, dann haben die Taster bereits einen Pull Down Widerstand
> (R7, R8, R11). Du solltest also die internen Pull Up Widerstände
> deaktivieren. Entweder nur Pull Up oder nur Pull Down, aber nicht beides
> gemischt.
>
> Wenn der Taster gedrückt ist, dann sieht der Controller Low.
> Wenn der Taster nicht gedrückt ist, dann sieht der Controller High.
>
> Gruß

Hallo Der,

ist zwar freundlich, dass du es schön findest, dass ich das mache, aber 
bei einer Sache liegst du falsch!
Wenn man den Taster drückt, dann sieht der Controller HIGH und nicht LOW 
(s. Seite 6 beim Datenblatt des Boards).

Siehst du vllt. den Fehler an dem Code?
1
  .include "m32def.inc"
2
  sbi DDRD,5
3
  sbi DDRD,6
4
  cbi DDRD,2
5
  // Hier beginnt das Hauptprogramm
6
  rjmp binaer0
7
  binaer0:
8
  // binaere 0 laden
9
  cbi PORTD,5
10
  cbi PORTD,6
11
  // Wenn Taster1 gedrueckt, dann gehe zur naechsten Sprungmarke
12
  // ansonsten gehe zur aktuellen (binaer0) Sprungmarke
13
  sbis PIND,2
14
  rjmp binaer0
15
  rjmp binaer1
16
  binaer1:
17
  cbi PORTD,5
18
  sbi PORTD,6
19
  sbis PIND,2
20
  rjmp binaer1
21
  rjmp binaer2
22
  binaer2:
23
  sbi PORTD,5
24
  cbi PORTD,6
25
  sbis PIND,2
26
  rjmp binaer2
27
  rjmp binaer3
28
  binaer3:
29
  sbi PORTD,5
30
  sbi PORTD,6
31
  sbis PIND,2
32
  rjmp binaer3
33
  rjmp binaer0

von Der (Gast)


Lesenswert?

Wie gesagt, schreibe das Programm um, und zwar so, dass die Ports nur 
geändert werden, wenn der Taster gedrückt ist. Die LEDs zählen dann 00 
bis 11 durch. Wenn der Taster nicht gedrückt wird, dann werden die Ports 
nicht geändert und behalten ihren vorherigen Wert. Die Anzeige bleibt 
also bei einer zufälligen Zahl stehen.

Philipp Buchmann schrieb:
> Wenn man den Taster drückt, dann sieht der Controller HIGH und nicht LOW
Stimmt, habe ich falsch gesehen.

von Higg G. (higg)


Lesenswert?

>Wie gesagt, schreibe das Programm um, und zwar so, dass die Ports nur
>geändert werden, wenn der Taster gedrückt ist.
Ehm, das ist seine funktionierende Ausgangssituation...

Um es kurz zu machen: Im Code kann ich keine Fehler entdecken. An deiner 
Stelle wäre mein nächster Schritt das Programm mal im Simulator des 
AVR-Studios laufen zu lassen. Erst normal, dann Schritt für Schritt. 
Funktioniert es dort ohne Probleme liegt es auch erstmal nicht am Code.

Denke auch daran dass ein AVR auf einem PIN mehrere Funktionen zur 
Verfügung stellt. Eventuell ist hier etwas im Hintergrund ungewollt in 
Betrieb was stört. Hänge die Ein und Ausgänge einfach mal auf komplett 
andere Pins.

von Philipp Buchmann (Gast)


Lesenswert?

Also, ich habe endlich den Fehler gefunden, wobei es ein sehr, sehr 
merkwürdiger Fehler ist:

Wenn ich Zeitschleifen setze, dann funktioniert das ganze:
1
  .include "m32def.inc"
2
  sbi DDRD,5
3
  sbi DDRD,6
4
  cbi DDRD,2
5
  // Hier beginnt das Hauptprogramm
6
  rjmp binaer0
7
  binaer0:
8
  // binaere 0 laden
9
  cbi PORTD,5
10
  cbi PORTD,6
11
  // Zeitschleife Anfang
12
  ldi  r17, $09
13
  WGLOOP0:
14
  ldi  r18, $6E
15
  WGLOOP1:
16
  dec  r18
17
  brne WGLOOP1
18
  dec  r17
19
  brne WGLOOP0
20
  ldi  r17, $01
21
  WGLOOP2:
22
  dec  r17
23
  brne WGLOOP2
24
  // Zeitschleife Ende
25
  sbis PIND,2
26
  rjmp binaer0
27
  rjmp binaer1
28
  binaer1:
29
  cbi PORTD,5
30
  sbi PORTD,6
31
  // Zeitschleife Anfang
32
  ldi  r17, $09
33
  WGLOOP0:
34
  ldi  r18, $6E
35
  WGLOOP1:
36
  dec  r18
37
  brne WGLOOP1
38
  dec  r17
39
  brne WGLOOP0
40
  ldi  r17, $01
41
  WGLOOP2:
42
  dec  r17
43
  brne WGLOOP2
44
  // Zeitschleife Ende
45
  sbis PIND,2
46
  rjmp binaer1
47
  rjmp binaer2
48
  binaer2:
49
  sbi PORTD,5
50
  cbi PORTD,6
51
  // Zeitschleife Anfang
52
  ldi  r17, $09
53
  WGLOOP0:
54
  ldi  r18, $6E
55
  WGLOOP1:
56
  dec  r18
57
  brne WGLOOP1
58
  dec  r17
59
  brne WGLOOP0
60
  ldi  r17, $01
61
  WGLOOP2:
62
  dec  r17
63
  brne WGLOOP2
64
  // Zeitschleife Ende
65
  sbis PIND,2
66
  rjmp binaer2
67
  rjmp binaer3
68
  binaer3:
69
  sbi PORTD,5
70
  sbi PORTD,6
71
  // Zeitschleife Anfang
72
  ldi  r17, $09
73
  WGLOOP0:
74
  ldi  r18, $6E
75
  WGLOOP1:
76
  dec  r18
77
  brne WGLOOP1
78
  dec  r17
79
  brne WGLOOP0
80
  ldi  r17, $01
81
  WGLOOP2:
82
  dec  r17
83
  brne WGLOOP2
84
  // Zeitschleife Ende
85
  sbis PIND,2
86
  rjmp binaer3
87
  rjmp binaer0

Ich habe die Zeitschleifen mit einem Zeitschleifengenerator erzeugt.
Jetzt sieht man wenigstens, dass die LED blinkt (wenn auch sehr schnell) 
und man kann auch mal andere Zahlen, als nur die 2 (=10) bekommen.

Danke nochmal für eure Hilfe.

von Der (Gast)


Lesenswert?

Hallo Philipp,

könntest du folgenden Code testen?
1
.include "m32def.inc"
2
sbi DDRD,5
3
sbi DDRD,6
4
cbi DDRD,2
5
6
7
; Hier beginnt das Hauptprogramm
8
main_start:
9
10
  sbic PIND,2
11
  rjmp binaer0ende
12
  ; binaere 0 laden, nur wenn Taster gedrueckt
13
  cbi PORTD,5
14
  cbi PORTD,6
15
  binaer0ende:
16
  
17
  sbic PIND,2
18
  rjmp binaer1ende
19
  ; binaere 1 laden, nur wenn Taster gedrueckt
20
  cbi PORTD,5
21
  sbi PORTD,6
22
  binaer1ende:
23
  
24
  sbic PIND,2
25
  rjmp binaer2ende
26
  ; binaere 2 laden, nur wenn Taster gedrueckt
27
  sbi PORTD,5
28
  cbi PORTD,6
29
  binaer2ende:
30
  
31
  sbic PIND,2
32
  rjmp binaer3ende
33
  ; binaere 3 laden, nur wenn Taster gedrueckt
34
  sbi PORTD,5
35
  sbi PORTD,6
36
  binaer3ende:
37
  
38
rjmp main_start

Gruß

von Higg G. (higg)


Lesenswert?

Hm, das ist schonmal ein Ansatz, aber leider keine Lösung.
Du hast ja selber geschrieben, dass du wissen willst wie ein 
Mikrocontroller funktioniert. Offenbar hast du in deinem gesamten Aufbau 
irgendeinen Fehler. Die Symptome des Fehlers hast du durch einen 
Workaround behoben. Gewöhne dir so etwas besser nicht an. Das Ergebnis 
wird sonst sein, dass du zukünftig sehr wartungsintensiven 
fehleranfälligen Code schreibst. Denn wer sagt dir, dass wenn du nun den 
Code erweiterst und noch ein paar weitere Zeilen hinzufügst, der Fehler 
nicht wieder auftritt?
Fehler sind dazu da um zu lernen, und wenn du wirklich die Ursache 
rausgefunden hast, wird dieser Fehler nicht so schnell wieder passieren.
Hast du den Code mal im Simulator laufen lassen, oder andere I/O-Pins 
probiert?

von Der (Gast)


Lesenswert?

Higg G. schrieb:
> Offenbar hast du in deinem gesamten Aufbau
> irgendeinen Fehler.

Es ist in der Tat ein komischer Fehler. Aber da es ein Evaluationboard 
ist, wird die Platine an sich wohl in Ordnung sein. Ein Kurzschluss 
zwischen den LEDs kann es eigentlich nicht sein, da sie sich einzeln 
ansteuern lassen.

Wenn ich mir den Code aus dem Startpost ansehe fällt mir was auf:
1
...
2
  binaer0:
3
  cbi OPD,5
4
  cbi OPD,6
5
...
Dieser Teil wird (wenn ich es richtig sehe) immer ausgeführt, also 
unabhängig vom Taster. Allerdings müssten dann die LEDs immer aus sein.

Mysteriös...

von Der (Gast)


Lesenswert?

Nachtrag:
Kannst du den Controller mal aus dem Sockel ziehen und wieder 
reindrücken?
Besser: Hast du einen anderen Controller zur Hand?

von Ich (Gast)


Lesenswert?

Der schrieb:
> Falls ja, dann haben die Taster bereits einen Pull Down Widerstand

Wer kommt denn auf solche sch*achsinnigen Ideen?
Die Kurzschlußströme, die bei jedem Tastendruck auf die 
330nF-Kondensatoren fließen (C17,C18,C19), die Kontakte verbratzeln und 
die Versorgungsspannung einbrechen lassen, möchte ich gar nicht sehen.

von Der (Gast)


Lesenswert?

@Philipp Buchmann

Hast du das Board selbst zusammengelötet?

von Kartoffelbauer (Gast)


Lesenswert?

Dein MC ist zu schnell,deine Hand zu langsam, darum gehts auch mit den 
Verzögerungen.

  cbi PORTD,5
  cbi PORTD,6
  cbi PORTD,5
  sbi PORTD,6
  sbi PORTD,5
  cbi PORTD,6

usw.

wie will man da etwas sehen

von Der (Gast)


Lesenswert?

Kartoffelbauer schrieb:
> Dein MC ist zu schnell,deine Hand zu langsam, darum gehts auch mit den
> Verzögerungen.
>
> ...
>
> wie will man da etwas sehen
Das ist ja der Witz an der Sache! Es geht so schnell das man nicht bei 
der Zahl anhalten kann, die man gerade möchte.
Wenn die Zahlen nur im Sekundentakt wechseln, dann kann man die Zahl 
"würfeln", die man gerade braucht.

von Philipp Buchmann (Gast)


Lesenswert?

Der schrieb:
> Higg G. schrieb:
>> Offenbar hast du in deinem gesamten Aufbau
>> irgendeinen Fehler.
>
> Es ist in der Tat ein komischer Fehler. Aber da es ein Evaluationboard
> ist, wird die Platine an sich wohl in Ordnung sein. Ein Kurzschluss
> zwischen den LEDs kann es eigentlich nicht sein, da sie sich einzeln
> ansteuern lassen.
>
> Wenn ich mir den Code aus dem Startpost ansehe fällt mir was auf:...
>   binaer0:
>   cbi OPD,5
>   cbi OPD,6
> ...
> Dieser Teil wird (wenn ich es richtig sehe) immer ausgeführt, also
> unabhängig vom Taster. Allerdings müssten dann die LEDs immer aus sein.
>
> Mysteriös...

Hmm...also, dass ist völlig korrekt, was du sagst, aber warum ist das 
denn mysteriös?? Also dieser Codeteil geht auf jeden Fall. Es ist ja 
schließlich egal, ob der PORTD Bit 5 und 6 dauernd entfernt werden. 
Kommt ja immer auf dasselbe hinaus.

>@Philipp Buchmann
>
>Hast du das Board selbst zusammengelötet?

Nein, das Board habe ich als Bauteil gekauft. Alles schon 
zusammengelötet.

Der schrieb:
> Kartoffelbauer schrieb:
>> Dein MC ist zu schnell,deine Hand zu langsam, darum gehts auch mit den
>> Verzögerungen.
>>
>> ...
>>
>> wie will man da etwas sehen
> Das ist ja der Witz an der Sache! Es geht so schnell das man nicht bei
> der Zahl anhalten kann, die man gerade möchte.
> Wenn die Zahlen nur im Sekundentakt wechseln, dann kann man die Zahl
> "würfeln", die man gerade braucht.

Genau! Also, ich möchte, dass man die Zahl eben zufällig "würfelt".
Wäre doch bescheuert, wenn die LED im Sekundentakt oszillieren würde. Da 
würde ja jeder bei Mensch-ärgere-dich-nicht o. ä. gewinnen :D.

> könntest du folgenden Code testen?

Der Code ist zwar nicht schlecht, aber leider entspricht er die Funktion 
meines ersten funktionierenden Codes:
1
// "include"-Dateien laden
2
  .include "m32def.inc"
3
// Variablen deklarieren
4
  .def temp=r16
5
  .equ IPA=PINA
6
  .equ IPB=PINB
7
  .equ IPC=PINC
8
  .equ IPD=PIND
9
  .equ OPA=PORTA
10
  .equ OPB=PORTB
11
  .equ OPC=PORTC
12
  .equ OPD=PORTD
13
  .equ DRA=DDRA
14
  .equ DRB=DDRB
15
  .equ DRC=DDRC
16
  .equ DRD=DDRD
17
// Datenrichtungsregister definieren
18
  sbi DRD,5
19
  sbi DRD,6
20
  cbi DRD,2
21
// Hauptcode
22
  rjmp binaer0
23
  binaer0:
24
  cbi OPD,5
25
  cbi OPD,6
26
  sbis IPD,2
27
  rjmp binaer1
28
  rjmp binaer0
29
  binaer1:
30
  cbi OPD,5
31
  sbi OPD,6
32
  sbis IPD,2
33
  rjmp binaer2
34
  rjmp binaer1
35
  binaer2:
36
  sbi OPD,5
37
  cbi OPD,6
38
  sbis IPD,2
39
  rjmp binaer3
40
  rjmp binaer2
41
  binaer3:
42
  sbi OPD,5
43
  sbi OPD,6
44
  sbis IPD,2
45
  rjmp binaer0
46
  rjmp binaer3

> Die Symptome des Fehlers hast du durch einen
> Workaround behoben. Gewöhne dir so etwas besser nicht an.

Genau das ist ja das Schlimme. Alle Codes, die ich bis jetzt geschrieben 
habe (nur kleine Codes wie T-FlipFlop, D-FlipFlop, Blinkprogramme, 
Inverter, Folger etc.) funktionierten. Nur dieser nicht.
Und das noch schlimmere ist: ich habe noch immer nicht den eigentlichen 
Fehler gefunden.
Denn wie schon gesagt: aus reiner Logik muss mein Code funktionieren und 
das haben ja schon einige aus dem Forum bestätigt.

Ich bin neugierig: Die meisten von euch (oder alle, damit ich keinen 
beleidige :D) haben doch bestimmt mehr Erfahrung und viele Projekte 
gemacht.
Kann mir nicht einmal einer von euch "Würfel-Projekte" schicken bzw. in 
das Forum posten?

Danke im Voraus!

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Philipp Buchmann schrieb:
> Denn wie schon gesagt: aus reiner Logik muss mein Code funktionieren

Sehe ich nicht so... Dein "Würfel" hat keinen stabilen Zustand und 
deshalb gibt es nur zwei (sichtbare) Zustände:
- Taster dauerhaft gedrückt
- Taster dauerhaft losgelassen
(jeweils vorausgesetzt die Hardware stimmt)

Das es noch jeweils zufällige Zwischenstände gibt sei mal unbestritten, 
diese siehst du nur nicht schnell genug.

Ein Würfel ist doch perfekt um sich mal mit Timer und Interrupt zu 
beschäftigen:
 - Ein 8bit Timer der immer durchläuft
 - Ein Taster am Interrupt Pin
 - Im (Tasten)Interrupt den Zählerstand auf einen Port mit LEDs ausgeben

Das der Taster prellt ist hier auch erst mal egal, und bei jedem 
Tastendruck wirst du dann eine neue zufällige Zahl auf den LEDs haben. 
Wenn du das dann noch auf die Zahlen 1-6 Einschränken willst kann man 
sich gleich im Anschluss mal mit dem CTC Modus beschäftigen und je nach 
gewürfelter Zahl 1-6 LEDs leuchten lassen.

von Karl H. (kbuchegg)


Lesenswert?

Der schrieb:
> Higg G. schrieb:
>> Offenbar hast du in deinem gesamten Aufbau
>> irgendeinen Fehler.
>
> Es ist in der Tat ein komischer Fehler. Aber da es ein Evaluationboard
> ist, wird die Platine an sich wohl in Ordnung sein.

Nein, ist es nicht.
Dass der Anschluss der Taster auf dem Pollin Board schwachsinnig ist, 
ist bekannt. Dass dieser Anschluss zu allerlei Fehlverhalten führt auch.

Bau dein Board entsprechend um, so dass es so funktioniert, wie die 
restliche Welt Tasten anschliesst:
Der Taster schaltet den Pin nach GND durch und du musst am Portpin den 
Pullup einaschalten. Ein nicht gedrückter Taster liefert dann eine 1, 
ein gedrückter Taster eine 0.

Zum Umbau
Beitrag "design fehler am atmel evaluations-board - programm stuerzt ab"
Beitrag "Pollin AVR Board Fehler beim drücken der Taster / Qualität der Bauteile"

von Kartoffelbauer (Gast)


Angehängte Dateien:

Lesenswert?

1
; Wuerfel mit 7 led an 4 portpins
2
;c. b.f.2005
3
; 3,6Volt - int. ozzilator  ca.500 khz
4
; power save mode
5
;plus piezopiepser fuer blinde :-)) an port pb1
6
; trigger  - level interupt on port pb1
7
8
.include "2343def.inc"  
9
.device at90s2343 
10
;    Bit     76543210 
11
.equ  WZ6 = 0b1101000    ; bits for numbers  
12
.equ  WZ5 = 0b11100100 
13
.equ  WZ4 = 0b11101100 
14
.equ  WZ3 = 0b11100101
15
.equ  WZ32 = 0b11110100    ; 2th for 3
16
.equ  WZ2 = 0b11101101
17
.equ  WZ22 = 0b11111100    ; 2th for 2 
18
.equ  WZ1 = 0b11110101
19
.equ  WZa = 0b00011101  ; All LEDs 
20
.equ  key = 0x01      ; Key on Port-Bit 1 from Port B 
21
.def  Dice_Reg = r17    ; Register for the pictures 
22
.def  Temp = r16      ; scratch
23
.def    T1 = r1
24
.def    T2 = r2
25
.def  count = r18      ;count for number
26
.def    speed  = r21      ; Delay
27
.def   status   =r0      ;low register to preserve status register
28
.def   mask = r19
29
.def   zahl = r20
30
;****EEProm*************************************************************
31
.eseg
32
.org 0
33
34
35
;****Source code***************************************************
36
.cseg          ;CODE segment
37
.org 0
38
    rjmp reset    ;Reset handler
39
    rjmp scan   ;   ext. interrupt
40
      reti      ;unused interrupt
41
        reti
42
;*** Reset handler **************************************************
43
;*** to provide initial port, timer and interrupt setting up
44
45
RESET: 
46
  ldi r16,low(RAMEND); Main program start  , you must set this correctly for Stack
47
   out SPL,r16
48
  
49
  ldi Temp, Wza    ; Switch Port B as bit 0 -3 Output , bit 4 as input 
50
  out DDRB, Temp  
51
  ldi Temp, Wza    ; All LEDs off 
52
  out PortB,Temp 
53
54
  ldi temp,0b00110000    ;turn on sleep mode and power
55
  out MCUCR,temp      ;down plus interrupt on low level.
56
  ldi temp,0x40      ;enable external interrupts
57
  out GIMSK,temp   
58
;**************************************************
59
main:  cli      ;disable global interrupts 
60
    
61
    
62
    
63
    sei      ;enable global interrupts ready
64
    sleep      ;fall asleep                 !!!!!!!!
65
    nop
66
    cli
67
    rcall Loop    ;flash LEDs for example usage
68
    
69
    ldi temp,0x40
70
    out GIMSK,temp    ;enable external interrupt
71
    rjmp main    ;go back to sleep after keyscan
72
73
; ***** repeat loop endlessly, show if key is pressed. 
74
Loop: 
75
       in temp,PINB      
76
    andi temp,0b00000010  
77
    breq Loop
78
    in temp,PINB      ;wait if pin pb1 low , timer is still running
79
    andi temp,0b00000010   ; zufallszahl
80
    breq Loop
81
82
    in count,TCNT0      ; read timer  
83
    
84
LD6:  ldi Dice_Reg, WZ6  ; show '6' 
85
    out PORTB,Dice_Reg   
86
    rcall Delay
87
    ldi zahl,6
88
    dec count
89
    breq ende2   
90
LD5:  ldi Dice_Reg, WZ5 
91
    out PORTB, Dice_Reg  
92
    rcall Delay
93
      ldi zahl,5
94
    dec count
95
    breq ende2 
96
LD4:  ldi Dice_Reg, WZ4 
97
    out PORTB, Dice_Reg  
98
    rcall Delay
99
      dec count
100
    ldi zahl,4
101
    breq ende2 
102
LD3:  ldi Dice_Reg, WZ3 
103
    out PORTB, Dice_Reg  
104
    rcall Delay
105
      ldi zahl,3
106
    dec count
107
    breq ende2 
108
109
LD2:  ldi Dice_Reg, WZ2 
110
    out PORTB, Dice_Reg  
111
    rcall Delay
112
      ldi zahl,2
113
    dec count
114
    breq ende2 
115
LD1:  ldi Dice_Reg, WZ1 
116
    out PORTB, Dice_Reg  
117
    rcall Delay
118
      ldi zahl,1
119
    dec count
120
    breq ende2 
121
    rjmp LD61    
122
ende2:
123
    nop        ; jump - branch only over 255 Byte adr. space
124
    rjmp ende
125
126
127
128
LD61:  ldi Dice_Reg, WZ6  ; show '6' 
129
    out PORTB,Dice_Reg  ; the same as before but with alternate 2 + 3
130
    rcall Delay
131
    ldi zahl,6
132
    dec count
133
    breq ende   
134
LD51:  ldi Dice_Reg, WZ5 
135
    out PORTB, Dice_Reg  
136
    rcall Delay
137
      ldi zahl,5
138
    dec count
139
    breq ende 
140
LD41:  ldi Dice_Reg, WZ4 
141
    out PORTB, Dice_Reg  
142
    rcall Delay
143
      dec count
144
    ldi zahl,4
145
    breq ende 
146
147
LD32:  ldi Dice_Reg, WZ32 
148
    out PORTB, Dice_Reg  
149
    rcall Delay
150
      ldi zahl,3
151
    dec count
152
    breq ende 
153
154
LD22:  ldi Dice_Reg, WZ22 
155
    out PORTB, Dice_Reg  
156
    rcall Delay
157
      ldi zahl,2
158
    dec count
159
    breq ende 
160
LD11:  ldi Dice_Reg, WZ1 
161
    out PORTB, Dice_Reg  
162
    rcall Delay
163
      ldi zahl,1
164
    dec count
165
    breq ende 
166
    rjmp LD6
167
168
ende:
169
  ldi speed,2
170
  rcall longDelay
171
  ldi temp,0b11111111 
172
              ;Port B bit 1 ztw. ausgang
173
  out DDRB,temp      ; for the piezobuzzer option
174
  dec zahl  
175
  rcall ton
176
  ldi temp,Wza
177
  
178
  out DDRB,temp
179
  ldi speed,4
180
  rcall longDelay
181
  
182
  ldi Temp, Wza    ; All LEDs off 
183
  out PortB,Temp 
184
  
185
  ret
186
187
;***Tactile feedback note generation routine*****************
188
;***provides a 4 kHz TONE to the piezo sounder for 5 ms*****
189
  ; at 4mhz crystal :-) so we must change  
190
ton:
191
    clr mask
192
      
193
tactile:  
194
    cbi PORTB,key    ;turn on piezo
195
    ldi temp,20    ;for a short time
196
t1again:  dec temp
197
    brne t1again
198
    sbi PORTB,key    ;turn on piezo
199
    ldi temp,20    ;for a short time
200
t2again:  dec temp
201
    brne t2again
202
    inc mask
203
    cpi mask,240    ;is half second up
204
    brne tactile
205
    ldi temp,200
206
    rcall Delay_3
207
    dec zahl      ; how many beep's
208
    brpl ton
209
    
210
    ret
211
    ;sbrs flags,ms5    ;repeat for 5ms
212
    ;rjmp tactile  
213
214
215
216
;**********************************************************************
217
218
longDelay: 
219
  mov temp,speed
220
     clr   T1                ;T1 used as delay 2nd count
221
  clr   T2                ;T2 used as delay 3d count
222
delay_1:    dec   T2
223
            brne  delay_1
224
            dec   T1
225
            brne  delay_1
226
            dec   temp              ;temp must be preset as 
227
            brne  delay_1           ;  delay master count
228
            ret
229
;*****************************************************************************
230
Delay:
231
    ldi temp,60
232
    ;mov T1,temp
233
delay_3:    clr T1  
234
delay_2:  dec   T1
235
        brne  delay_2
236
        dec   temp              ;temp must be preset as 
237
        brne  delay_2           ;  delay master count
238
        ret
239
240
241
242
243
;****external rInterrupt service routine***************************************
244
scan:    
245
    in status,SREG    ;preserve status register
246
    
247
    ;xxxxxxxxxxxxxxxxx
248
    ;put some code when you want
249
    ldi temp,1
250
    out TCCR0,temp    ; start int.Timer for generating flukiness dice  
251
252
    ;xxxxxxxxxxxxxxxxx
253
    out SREG,status    ;restore status register
254
255
    ldi temp,0x00
256
    out GIMSK,temp     ;disable external interrupt
257
              ;have to do this, because we're
258
              ;using a level-triggered interrupt
259
260
    reti

von Karl H. (kbuchegg)


Lesenswert?

Entschuldigt meine Frage
Aber was wird das eigentlich?
Ein Wettbewerb für
Wie kann ich möglichst kompliziert in einer Schleife von 0 bis 3 
(respektive 0 bis 5) zählen, solange eine Taste gedrückt ist und nach 
dem Loslassen den letzten Zählerastand anzeigen bis die Taste erneut 
gedrückt wird?

von Kartoffelbauer (Gast)


Lesenswert?

Warum einfach wenn es auch kompliziert geht :-)
Die dümmsten Bauern ernten die dicksten ....

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> solange eine Taste gedrückt ist und nach
> dem Loslassen den letzten Zählerastand anzeigen bis die
> Taste erneut gedrückt wird?
Das Problem ist eben es gibt nicht den Zustand "bis die Taste erneut 
gedrückt wird" sondern das rauscht fröhlich durch...

von Karl H. (kbuchegg)


Lesenswert?

Läubi .. schrieb:
> Karl Heinz Buchegger schrieb:
>> solange eine Taste gedrückt ist und nach
>> dem Loslassen den letzten Zählerastand anzeigen bis die
>> Taste erneut gedrückt wird?
> Das Problem ist eben es gibt nicht den Zustand "bis die Taste erneut
> gedrückt wird" sondern das rauscht fröhlich durch...

Für einen simulierten Würfel passt das doch.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> Für einen simulierten Würfel passt das doch.

Naja aber nicht ohne Entprellung und "Endzustand", im Moment rasselt das 
wohl einfach durch, sodass man immer im gleichen Zustand landet.

von Karl H. (kbuchegg)


Lesenswert?

Läubi .. schrieb:
> Karl Heinz Buchegger schrieb:
>> Für einen simulierten Würfel passt das doch.
>
> Naja aber nicht ohne Entprellung

Darüber hab ich auch mal ein wenig nachgedacht. Die Frage ist: in wie 
weit verfälscht das Prellen eigentlich die Zufälligkeit.
Ich bin zu keiner eindeutigen Antwort gekommen. Auf der einen Seite hat 
man durch das Prellen keine eindeutig definierte 'Niederdrückzeit' mehr. 
Auf der anderen Seite schafft es sowieso kein Mensch eine Taste auf ein 
paar µs genau zu drücken.
Im Moment denke ich, es spielt keine Rolle. Die Ergebnisse sind deswegen 
nicht schlechter. Obwohl. Bei Zufallszahlen muss man vorsichtig sein. 
Die Verteilung ist schnell zerstört bzw. man hat einen Bias drinnen.

> wohl einfach durch,

genau so hätte ich das auch angedacht. Und da kein Mensch eine Taste 
gezielt auf µs genau in der Zeitdauer drücken kann, kriegt man bei jedem 
Druck ein anderes Ergebnis.

   while( 1 )
   {
     if( key_is_pressed )
     {
       cube++;
       if( cube == 6 )
         cube = 0;
     }
     display( cube + 1 );
   }

Ich nutz einfach aus, dass man als menschlicher Benutzer nicht gezielt 
steuern kann, wieviele Durchläufe durch die Schleife gemacht werden.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> Im Moment denke ich, es spielt keine Rolle. Die
> Ergebnisse sind deswegen
> nicht schlechter.

Das nicht, der TE hat aber einfach die Sprungbefehle getauscht anstelle 
sbic durch sbis zu ersetzen, so wie du es in C gemacht hast wäre auch 
mein Ansatz und dann ist das prellen auch egal.

von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

Du brauchst eine Statemaschine, sonst ist das nur ein wirres 
Umhergespringe, wo keiner durchsieht.

Eine gleiche Warscheinlichkeit ist in der Tat nicht trivial. Ich benutze 
daher einen Timerinterrupt zum Einlesen des Loslassens. Damit ist die 
Warscheinlichkeit für jede Ziffer gleich und unabhängig von der 
Mainloop.
Die Mainloop macht nur die Statemaschine.

Um den Eindruck zu erwecken, man könnte den Würfel manipulieren, läuft 
der sichtbare Würfel extra langsam. Der eigentliche Würfel läuft aber 
unsichtbar, erst wenn der sichtbare Würfel ausgerollt ist, sieht man 
ihn.

Der C-Code läßt sich leicht auf einen AVR anpassen.


Peter

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.