#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
;; 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
; 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
.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
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
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
;; 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