Zorbing

[TGI] Gatter-Tester

Jan 23rd, 2014
402
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  * TGI_10.asm
  3.  *
  4.  *  Created: 28.11.2013 13:37:11
  5.  *   Author: Ehlers/Meyer/Boekhoff/Jaehn
  6.  */
  7. .include "m16def.inc"
  8.  
  9. .def    TMP = R16
  10. ; Definieren Sie für die Gatter R20 bis R23 die Namen GATTER_TYPE, COUNTER, CURRENT_GATTER, BLINK.
  11. .def    GATTER_TYPE = R20
  12. .def    COUNTER = R21
  13. .def    CURRENT_GATTER = R22
  14. .def    BLINK = R23
  15.  
  16. ; Definieren Sie die Konstanten NUM_GATTER_TYPES = 3, TYPE_AND = 0, TYPE_NAND = 1, TYPE_OR = 2 und TYPE_UNKNOWN = 3.
  17. .equ    NUM_GATTER_TYPES = 3
  18. .equ    TYPE_AND = 0
  19. .equ    TYPE_NAND = 1
  20. .equ    TYPE_OR = 2
  21. .equ    TYPE_UNKNOWN = 3
  22.  
  23. .dseg
  24. .org    $0100
  25. ; Stellen Sie im RAM unter dem Label GATTER_TYPES 4 Byte zur Verfügung.
  26. GATTER_TYPES:   .byte 4
  27.  
  28. .cseg
  29. ; Interrupt Vektor Tabelle
  30. .org    $0000
  31.     rjmp    init
  32. .org    $0026                               ; OC0addr
  33.     rjmp    TIMER0_COMP_ISR
  34. ; Legen Sie jeweils die vier Ausgaben der Gatter unter den Labeln AND_GATTER, NAND_GATTER und OR_GATTER im ROM ab.
  35. ; Verwenden Sie für jede Ausgabe jeweils 1 Byte.
  36. ; Diese sollen direkt zu der sequentiellen Belegungen der Eingänge mit den Werten null bis drei korrespondieren.
  37. .org    $002A
  38. AND_GATTER:     .db 0b00000000, 0b00001001, 0b00010010, 0b00111111
  39. NAND_GATTER:    .db 0b00100100, 0b00101101, 0b00110110, 0b00011011
  40. OR_GATTER:      .db 0b00000000, 0b00101101, 0b00110110, 0b00111111
  41.  
  42.  
  43. .org    $0060
  44. ; *****************************************************************************
  45. ; Initialisierung
  46. ; *****************************************************************************
  47. init:
  48.     ; Initialisierung des Stack Pointers
  49.     ldi     TMP,    high(RAMEND)
  50.     out     SPH,    TMP
  51.     ldi     TMP,    low(RAMEND)
  52.     out     SPL,    TMP
  53.  
  54.     ; Portdefinitionen (PORT A und B)
  55.     ldi     TMP,    0b11011011
  56.     out     DDRA,   TMP
  57.     out     DDRB,   TMP
  58.  
  59.     ; Portdefinitionen (PORT C)
  60.     out     DDRC,   TMP
  61.  
  62.     ; Portdefinitionen (PORT D)
  63.     ldi     TMP,    0b11111110
  64.     out     DDRD,   TMP
  65.  
  66.     ; Initialisierung der Anfangswerte einzelner Register
  67.     ldi     BLINK,  0
  68.     ; ------ TODO ------ ;
  69.  
  70.     ; Initilaisierung des Timers
  71.     ; Vergleichswert für Timer0 (~100 ms) in das Compare Register schreiben
  72.     ; ------ TODO ------ ;
  73.     ldi     TMP,    100
  74.     out     OCR0,   TMP
  75.  
  76.     ; Clear-Timer-On-Compare-Match (CTC) Modus einstellen &
  77.     ; Prescaler auf clk/1024 für den Timer0 einstellen
  78.     ldi     TMP,    (1<<COM01) | (1<<COM00) | (1<<WGM01) | (1<<CS02) | (1<<CS00)
  79.     out     TCCR0,  TMP
  80.  
  81.     ; Interrupt für Compare-Match des Timers0 lokal aktivieren
  82.     ldi     TMP,    (1<<OCIE0)
  83.     out     TIMSK,  TMP
  84.  
  85.     ; Interrupts global aktivieren
  86.     sei
  87.  
  88.     rjmp    main
  89.  
  90.  
  91. ; Das Hauptprogramm verbleibt in einer Endlosschleife, bis an PD0 ein High-Pegel detektiert wird.
  92. ; Wärend des Wartens sollen die LEDs ausgeschaltet sein und keine Spannung an den Eingängen des Gatters anliegen.
  93. ; Ist der Taster gedrückt, so beginnt das Hauptprogramm sequentiell die einzelnen Gatter des ICs mithilfe des Unterprogramms TEST_GATTER zu übeprüfen
  94. ; und speichert die einzelnen Gattertypen entsprechend im RAM unter dem Label GATTER_TYPES ab.
  95. ; Wurden alle Gatter des ICs übeprüft, erfolgt die Ausgabe mithilfe des Unterprogramms OUTPUT.
  96. ; Dieses erwartet im Register R16 den Typ des ICs, welcher dem ersten im RAM gespeicherten Typen entspricht, der ungleich TYPE_UNKNOWN ist.
  97. ; Sollte es sich um ein unbekanntes oder komplett defektes Gatter handeln, so enthält R16 den Typ TYPE_UNKNOWN.
  98. ; Anschließen wird wieder zu main gesprungen.
  99.  
  100. main:
  101.     sbis    PIND, PIND0
  102.     rjmp    main
  103.     ; Analyse starten
  104.     ldi     CURRENT_GATTER, 0               ; aktuelles zu pruefendes Gatter
  105.     ldi     XH,     high(GATTER_TYPES)
  106.     ldi     XL,     low(GATTER_TYPES)
  107. gatter_loop:
  108.     inc     CURRENT_GATTER                  ; naechstes Gatter
  109.     call    TEST_GATTER
  110.     st      X+,     GATTER_TYPE             ; ermittelten Gatter-Typ speichern
  111.     cpi     CURRENT_GATTER, 4               ; sind alle Gatter ueberprueft?
  112.     brne    gatter_loop
  113.  
  114.     ldi     COUNTER, 4
  115.     ld      R16,    -X                      ; lade den ersten Typen
  116.     ldi     XH,     high(GATTER_TYPES)
  117.     ldi     XL,     low(GATTER_TYPES)
  118. suche_typ:
  119.     ld      R16,    X+                      ; speichere den Typ
  120.     cpi     R16,    TYPE_UNKNOWN            ; ist der Typ nicht unbekannt?
  121.     brne    typ_gefunden
  122.     dec     COUNTER
  123.     brne    suche_typ
  124. typ_gefunden:
  125.     call    OUTPUT                          ; Ausgeben des Vergleichsergebnisses: R16 enthaelt den Typ des gesamten Bausteins
  126.     rjmp    main
  127.  
  128.  
  129. ; Dieses Unterprogramm testet das in CURRENT_GATTER gegebene Gatter des ICs und
  130. ; liefert als Ergebnis in GATTER_TYPE den Gattertypen zurück.
  131. ; Dazu werden die Eingänge des Gatters sequentiell mit den Eingaben null bis drei belegt und die Ausgabe ensprechend der im ROM abgelegten Prüfwerte verglichen.
  132. ; Es muss bei der Ansteuerung der einzelnen Gatter darauf geachtet werden, dass die Ausgabe der LEDs nicht beeinflusst wird.
  133. ; Zwischen dem Setzen der Eingaben der Gatter und dem Auslesen der Ausgänge sollte eine kleine Wartezeit von einem Leertakt eingehalten werden.
  134. TEST_GATTER:
  135.     ldi     ZH,     high(AND_GATTER<<1)
  136.     ldi     ZL,     low(AND_GATTER<<1)
  137.     ldi     GATTER_TYPE, TYPE_AND           ; Nummber des zu ueberpruefenden Gatter-Typen
  138.     ldi     COUNTER, 4                      ; wie viele Tests wurden pro Gatter-Art schon ausgefuehrt
  139. type_loop:
  140.     lpm     TMP,    Z+                      ; nachsten Test laden
  141.     out     PORTA,  TMP                     ; auf die Ports ...
  142.     out     PORTB,  TMP                     ; ... schreiben
  143.     in      R17,    PINA                    ; von den Pins ...
  144.     in      R18,    PINB                    ; ... lesen
  145.     eor     R17,    TMP                     ; Exklusiv- ...
  146.     eor     R18,    TMP                     ; ... verodern
  147.     ; switching
  148.     cpi     CURRENT_GATTER, 1
  149.     breq    test_PA2                        ; Gatter 1 pruefen
  150.     cpi     CURRENT_GATTER, 2
  151.     breq    test_PA5                        ; Gatter 2 pruefen
  152.     cpi     CURRENT_GATTER, 3
  153.     breq    test_PB2                        ; Gatter 3 pruefen
  154.     cpi     CURRENT_GATTER, 4
  155.     breq    test_PB5                        ; Gatter 4 pruefen
  156.  
  157. test_PA2:
  158.     sbrs    R17,    PINA2                   ; ist PINA2 gesetzt (unterscheidet sich PINA2 von dem erwarteten Wert)?
  159.     rjmp    type_match                      ; ... wenn nicht, naechster Test
  160.     rjmp    type_mismatch                   ; sonst: naechster Typ
  161. test_PA5:
  162.     sbrs    R17,    PINA5                   ; PINA5 wie erwartet?
  163.     rjmp    type_match                      ; nein: naechster Test
  164.     rjmp    type_mismatch                   ; sonst: naechster Typ
  165. test_PB2:
  166.     sbrs    R18,    PINB2                   ; PINB2 wie erwartet?
  167.     rjmp    type_match                      ; nein: naechster Test
  168.     rjmp    type_mismatch                   ; sonst: naechster Typ
  169. test_PB5:
  170.     sbrs    R18,    PINB5                   ; PINB5 wie erwartet?
  171.     rjmp    type_match                      ; nein: naechster Test
  172.     rjmp    type_mismatch                   ; sonst: naechster Typ
  173.  
  174. type_match:
  175.     ; nachster Test
  176.     dec     COUNTER
  177.     breq    test_end                        ; alle 4 Tests waren erfolgreich
  178.     rjmp    type_loop                       ; naechsten Test durchfuehren
  179. type_mismatch:
  180.     ; nachsten Typen ausprobieren
  181.     inc     GATTER_TYPE
  182.     cpi     GATTER_TYPE, TYPE_UNKNOWN       ; Abbruchbedingung
  183.     breq    test_end                        ; alle Gatter-Typen getestet
  184.     dec     COUNTER                         ; zaehler noch dekrementieren
  185.     brne    z_restore                       ; sind noch unausgefuehrte Tests verblieben? -> Z-Register korrigieren
  186.     ldi     COUNTER, 4                      ; Test-Zaehler zuruecksetzen
  187.     rjmp    type_loop                       ; zurueck zur Schleife
  188. z_restore:
  189.     lpm     TMP,    Z+                      ; inkrementiere die Adresse im Z-Register
  190.     dec     COUNTER
  191.     brne    z_restore                       ; bis sie auf dem ersten Test des naechsten Typs steht
  192.     ldi     COUNTER, 4
  193.     rjmp    type_loop
  194. test_end:
  195.     ret
  196.  
  197.  
  198. ; Die Interrupt Service Routine soll das untere Bit des Register BLINK je Aufruf invertieren.
  199. TIMER0_COMP_ISR:
  200.     push    TMP                             ; Sichere TEMP
  201.     in      TMP,    SREG                    ; Lade das SREG in TEMP
  202.     push    TMP
  203.     ldi     TMP,    1
  204.     eor     BLINK,  TMP
  205.     pop     TMP                             ; Hole das SREG wieder vom Stack
  206.     out     SREG,   TMP                     ; Und schreibe es raus
  207.     pop     TMP
  208.     reti
  209.  
  210. ; Das Unterprogramm OUTPUT erwartet im Register R16 den Typen des IC-Bausteins (TYPE_AND|TYPE_NAND|TYPE_OR|TYPE_UNKNOWN)
  211. OUTPUT:
  212.     push    R16
  213.     push    R17
  214.     push    R18
  215.     push    R19
  216.     push    COUNTER
  217.     ; R16 enthält den Gattertypen
  218.     ldi     xl,     low(GATTER_TYPES)
  219.     ldi     xh,     high(GATTER_TYPES)
  220.     clr     COUNTER
  221.     clr     R19
  222.     cpi     R16,    TYPE_UNKNOWN
  223.     brne    loop_out
  224.     sbrs    BLINK,  0
  225.     rjmp    all_off
  226.     ldi     R17,    0xC0
  227.     out     PORTA,  R17
  228.     out     PORTB,  R17
  229.     ldi     R17,    0xC3
  230.     out     PORTC,  R17
  231.     ldi     R17,    0x1E
  232.     out     PORTD,  R17
  233.     rjmp    loop_out_end
  234. all_off:
  235.     clr     R17
  236.     out     PORTA,  R17
  237.     out     PORTB,  R17
  238.     out     PORTC,  R17
  239.     out     PORTD,  R17
  240.     rjmp    loop_out_end
  241. loop_out:
  242.     ld      R18,    x+
  243.     lsr     R19
  244.     cp      R18,    R16
  245.     brne    loop_out_ne_blink
  246.     ldi     R17,    0x80
  247.     add     R19,    R17
  248.     rjmp    loop_out_ne
  249. loop_out_ne_blink:
  250.     sbrc    BLINK,  0
  251.     rjmp    loop_out_ne
  252.     ldi     R17,    0x80
  253.     add     R19,    R17
  254. loop_out_ne:
  255.     inc     COUNTER
  256.     sbrs    COUNTER,2
  257.     rjmp    loop_out
  258.     ; Ausgabe ist in den 4 MSB von R19 enthalten
  259.     cpi     R16,    TYPE_AND
  260.     brne    loop_out_nand
  261.     mov     R17,    R19
  262.     andi    R17,    0xC0
  263.     out     PORTB,  R17
  264.     mov     R17,    R19
  265.     lsl     R17
  266.     lsl     R17
  267.     out     PORTA,  R17
  268.     rjmp    loop_out_end
  269. loop_out_nand:
  270.    cpi      R16,    TYPE_NAND
  271.     brne    loop_out_or
  272.     swap    R19
  273.     lsl     R19
  274.     out     PORTD,  R19
  275.     rjmp    loop_out_end
  276. loop_out_or:
  277.     mov     R17,    R19
  278.     swap    R17
  279.     or      R17,    R19
  280.     andi    R17,    0xC3
  281.     out     PORTC,  R17
  282. loop_out_end:
  283.     pop     COUNTER
  284.     pop     R19
  285.     pop     R18
  286.     pop     R17
  287.     pop     R16
  288.     ret
Advertisement
Add Comment
Please, Sign In to add comment