Übung

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main (void) {
    time_t t;
    int y1, y2, y3;
    int x2, x1, x0;
    int i;

    srand ((unsigned)time (&t));

    y1 = rand () % 8;
    while ((y2 = rand () % 8) == y1);
    while (1) {
        y3 = rand () % 8;
        if ((y3 != y2) && (y3 != y1))
            break;
    }

    printf ("x2\tx1\tx0\ty\n");
    for (x2 = 0, i = 0;  x2 <= 1;  x2++)
        for (x1 = 0;  x1 <= 1;  x1++)
            for (x0 = 0;  x0 <= 1;  x0++, i++) {
                if ((y3 == i) || (y2 == i) || (y1 == i))
                    printf ("%i\t%i\t%i\t1\n", x2, x1, x0);
                else
                    printf ("%i\t%i\t%i\t0\n", x2, x1, x0);
            }

return 0;
}

Ausgabe:

x2	x1	x0	y
0	0	0	0
0	0	1	0
0	1	0	0
0	1	1	1
1	0	0	1
1	0	1	0
1	1	0	1
1	1	1	0

x2	x1	x0	y
0	0	0	0
0	0	1	0
0	1	0	0
0	1	1	1
1	0	0	1
1	0	1	0
1	1	0	1
1	1	1	0

x2	x1	x0	y
0	0	0	1
0	0	1	0
0	1	0	0
0	1	1	0
1	0	0	1
1	0	1	0
1	1	0	1
1	1	1	0

x2	x1	x0	y
0	0	0	1
0	0	1	1
0	1	0	0
0	1	1	1
1	0	0	0
1	0	1	0
1	1	0	0
1	1	1	0

x2	x1	x0	y
0	0	0	0
0	0	1	0
0	1	0	0
0	1	1	1
1	0	0	0
1	0	1	1
1	1	0	1
1	1	1	0

gut jetzt die uebungen, 7408 ist AND gatter. Die haben 4 AND Gatter, A und B und C mal vier.

Da ich 3 AND zeilen habe, mit dem wert 1 brauche ich 3 solcher IC's. 2 sind bei mir schon drauf

Das OR Gatter, 7432 hat auch vier Gatter jeweils, da reicht eines. Also fange ich an. Noch ein 7408

Achso, NOT brauche ich noch - da x2, x1, x0 jeweils wahr und falsch ist, aber alle auf das gleiche zugreifen, brauche ich ein IC mit Inverter HEX Inverter, das sind 6 Inverter. Das ist ein 7404 so weit ich weiss, 6 Inverter, 3 Eingangsvariablen, reicht 1 IC

Habe ich jeweils Gatter mit drei eingehen geschaffen

Das sieht man gleich die Rechnung stimmte nicht man braucht keine drei 7408 AND IC es ist 2:00 Uhr morgens und man muss es eben üben, weil man braucht auf jeden Baustein sind 4 AND Gatter und d.h. bei drei Eingängen braucht man dafür jeweils 2 AND Gatter

Bei drei AND Gattern mit drei Eingängen braucht man 1.5 Bausteine. Egal, dann benutzt man nur die eine Seite, umso besser bei den drei Zeilen in der disjunktiven notmalform

So, und ich schreibe auch noch ein Übungsprogramm. Weil vorher nehme ich die Eingangs variablen, die nehme ich vom avr der hat zum Glück mehrere Ports und da mache ich das so. Ich schreibe ein Programm, was innerhalb von 1 Sekunde, also im Takt von 1 Sekunde die Eingangs variablen die drei Eingangs variablen entsprechend ändert. Woher weiß ich dann? Wie die stehen? Ganz einfach ich habe ja mehrere Ports an dem avr und ich kann synchron. Das ist ein Unterschied von mehreren. Microsekunden für das Auge gleichzeitig die selbe Kombination an dem einen Port, wie an dem anderen ausgeben und auf dem Programmiergerät stk500 sind schöner weiße LEDs ich hab drei Eingangs variablen die kann ich dann gleichzeitig an drei LEDs an dem stk500 ausgeben, das ist nur ein Programm für die Übung des schreib ich jetzt gleich und ist ganz einfach

Image IMG_3847

Image IMG_3848

Image IMG_3849

Image IMG_3850

Image IMG_3851

Image IMG_3852

Image IMG_3853

Image IMG_3854

Image IMG_3855

Image IMG_3856

Image IMG_3857

;; das ist so zu sagen, die Grundlage und jetzt muss die Schleife rein, die das hochzaehlt mitsamt, einer warteschleife

.include "m8def.inc"

ldi r16, 0xff
out DDRD, r16
out DDRB, r16

ldi r16, 0b00000101
out PORTB, r16
out PORTD, r16

https://www.ituenix.de/html/vid/IMG_3865.mov

; OK, das tut, ich zeige Film

.include "m8def.inc"

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

ldi r16, 0xff
out DDRD, r16
out DDRB, r16

ldi r16, 0x01
loop1:
out PORTB, r16
out PORTD, r16
rcall sleep
inc r16
cpi r16, 0b00001000
brne loop1
ldi r16, 0x00
rjmp loop1

sleep:
push r16
push r17
ldi r16, 0xff
sleep_loop1:
dec r16
ldi r17, 0xff
sleep_loop2:
dec r17
cpi r17, 0x01
brne sleep_loop2
cpi r16, 0x01
brne sleep_loop1
pop r17
pop r16
ret

Die Ausgabe an den LEDs vom STK500 sind immer invertiert nur die LEDs vom STK500 nicht die Pins vom Port des Atmega8 deswegen invertier ich noch die Ausgabe, an dem ein Port

https://www.ituenix.de/html/vid/IMG_3866.mov

.include "m8def.inc"

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

ldi r16, 0xff
out DDRD, r16
out DDRB, r16

ldi r16, 0x01
loop1:
mov r17, r16
com r17
out PORTB, r17
out PORTD, r16
rcall sleep
inc r16
cpi r16, 0b00001000
brne loop1
ldi r16, 0x00
rjmp loop1

sleep:
push r16
push r17
ldi r16, 0xff
sleep_loop1:
dec r16
ldi r17, 0xff
sleep_loop2:
dec r17
cpi r17, 0x01
brne sleep_loop2
cpi r16, 0x01
brne sleep_loop1
pop r17
pop r16
ret

Okay, ich hab die erste zeile schon mal angeschlossen und die tut schon mal. Ich zeige gleich ein Video bei der ersten Zeile also bei der ersten Zeile die von Relevanz ist geht es bei der Kombination 011 an, wobei wir bedenken müssen die null ist x2, also die Eingangs variablen richtig rum zählen x2,x1,x0

Image IMG_3861

Image IMG_3862

Image IMG_3863

Image IMG_3864

Ist gerade ein Fehler drin. Es leuchtet auch an der Stelle wo ich 011 Das ist aber logisch, als ich die Schaltung eingesteckt hab und die LED schon drin war. Hat es teilweise geleuchtet, teilweise nicht obwohl nichts geschaltet war. Das ist eben weil bei zwei der AND Gatter nichts drauf ist aber keine Sorge es tut es. Werden wir gleich sehen, wenn die auch noch verschaltet sind. Des. OR schon mal mit den AND verbunden und das eine AND angeschlossen jetzt kommen noch die zwei anderen das ist kein Problem

https://www.ituenix.de/html/vid/IMG_3870.mov

Jetzt ist fertig und es sieht gut aus. Ich zeige den Film man sieht das charakteristische einmal doppelt länger leuchten und einmal kurz leuchten. Das kann nur auf eins zehn deuten. Ich zeige jetzt erst mal ein Foto von der Schaltung und dann schalte ich den Takt bisschen runter, damit man besser mit sehen

Image IMG_3867

Image IMG_3868

Image IMG_3869

;; hier das langsamere Programm

.include "m8def.inc"

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

ldi r16, 0xff
out DDRD, r16
out DDRB, r16

ldi r16, 0x01
loop1:
mov r17, r16
com r17
out PORTB, r17
out PORTD, r16
rcall sleep
inc r16
cpi r16, 0b00001000
brne loop1
ldi r16, 0x00
rjmp loop1

sleep:
push r16
push r17
push r18
ldi r16, 0xff
sleep_loop1:
dec r16
ldi r17, 0xff
sleep_loop2:
dec r17
ldi r18, 0x08
sleep_loop3:
dec r18
cpi r18, 0x01
brne sleep_loop3
cpi r17, 0x01
brne sleep_loop2
cpi r16, 0x01
brne sleep_loop1
pop r18
pop r17
pop r16
ret

und es tut

x2	x1	x0	y
0	0	0	0
0	0	1	0
0	1	0	0
0	1	1	1
1	0	0	1
1	0	1	0
1	1	0	1
1	1	1	0
https://www.ituenix.de/html/vid/IMG_3871.mov

https://www.ituenix.de/html/vid/IMG_3872.mov