Forum: Mikrocontroller und Digitale Elektronik Was ist heir falsch (programmcode)


von Spyro (Gast)


Lesenswert?

kann mir mal jemand sagen was ich hier falsch gemacht habe? es geht 
alles fehlerfrei zu assemblieren und auch bei der simulation ist 
eigentlich alles so wie es sein soll.
jedoch wenn ich mit dem multimeter an den pins nachmesse, schwankt die 
spannung ununterbrochen nur hin und her.
was ist da falsch, bin am verzewifeln. habe es auch mit mehreren 
gleichen microcontrollern ausprobiert zund es geht trotzdem nichts :(
mfg

Code:
;***************************************
.include "m16def.inc"
;***************************************

.def temp = r16
init:  ldi     temp, LOW (RAMEnD)    ; Stackpointer initialisieren
        out     SPL, temp
        ldi     temp, HIGH (RAMEnD)
        out     SPH, temp
    LDI    R22, 255    ;initialisieren
    OUT    DDRA, r22
    OUT    DDRB, r22
    OUT    DDRC, r22
    OUT    DDRD, r22
    LDI    r18, 0
    LDI    r19, 255
main:  LDI    R17, 0b00000001  ;aufbau in rot
main1:  ROR    r17
    out    PORTA, r17
    CPI    r17, 255
    BRNE  main1
main2:  LDI    R17, 0b00000001
main3:  ROR    r17
    out    PORTB, r17
    CPI    r17, 255
    BRNE  main3
    call warten        ;warten
    out    PORTA, r18    ;alles aus
    out    PORTB, r18
main4:  LDI    R17, 0b00000001  ;aufbau in grün
main5:  ROR    r17
    out    PORTC, r17
    CPI    r17, 255
    BRNE  main5
main6:  LDI    R17, 0b00000001
main7:  ROR    r17
    out    PORTD, r17
    CPI    r17, 255
    BRNE  main7
    call warten        ;warten
    out    PORTC, r18    ;alles aus
    out    PORTD, r18
main8:  LDI    R17, 0b00000001  ;aufbau in orange
main9:  ROR    r17
    out    PORTA, r17
    out    PORTC, r17
    CPI    r17, 255
    BRNE  main9
main10:  LDI    R17, 0b00000001
main11:  ROR    r17
    out    PORTB, r17
    out    PORTD, r17
    CPI    r17, 255
    BRNE  main11
    call warten        ;warten
    out    PORTA, r18    ;alles aus
    out    PORTB, r18
    out    PORTC, r18
    out    PORTD, r18
    nop
    call warten        ;warten
    out    PORTA, r19    ;schrift rot
    out    PORTB, r19
    nop
    call warten        ;warten
    out    PORTA, r18    ;alles aus
    out    PORTB, r18
    out    PORTC, r19    ;alles grün
    out    PORTD, r19
    nop
    call warten        ;warten
    out    PORTC, r18    ;alles aus
    out    PORTD, r18
    out    PORTA, r19    ;alles orange
    out    PORTB, r19
    out    PORTC, r19
    out    PORTD, r19
    nop
    call warten        ;warten
    out    PORTA, r18    ;alles aus
    out    PORTB, r18
    out    PORTC, r18
    out    PORTD, r18

    rjmp  main

warten: sbiw XL, 1           ; Zähler dekrementieren   2 Takte
    brne warten
    reti

von Otto (Gast)


Lesenswert?

Hallo Spyro,

was soll das Programm denn machen - weshalb verwendest Du ein "reti" am 
Ende ?

Otto

von FRAGENSTELLER (Gast)


Lesenswert?

und wie sieht die hardware dazu aus.
(z.b. diverse widerstände (pull-up) an den ein- und ausgängen)

von Thomas (kosmos)


Lesenswert?

wie schnell ist den das ganze getaktet? In main 1-3 gehen die Pins am 
Port A und B nacheinander auf High bis alle auf High stehen und zwar so 
schnell das du auch dieses Schieben gar nicht sehen wirst(falls da Leds 
dranhängen) und auch einfach 255 an die beiden Port geben könntest. 
Danach gehts per call in die Warteschleife (65535 Takte bei 8 Mhz dauert 
das gerade mal 8mSek) um da rauszukommen muss statt des reti ein ret 
benutzt werden, mit Reti steigt man aus einer Interruptroutine aus. Im 
AVR-Studio wirds zwar wie ein ret simuliert wie es aber der AVR selbst 
macht weiß ich nicht. Der rest wiederholt sich dann ja alles nur mit 
anderen Ports.

Selbst wenn du das Ding mit dem geringsten internen Takt(1 MHz) taktest 
bis du gerade mal bei 65mSek wo alle Pins High sind, also mit einem 
Multimeter ist da nichts zu machen, mit ein paar Leds wäre da schon 
etwas zu sehen. Oder aber du taktest das Ding mal extern mit wenigen kHz 
um die Effekte beobachten zu können.

Schalte mal im Simulator unter View->Toolbars->Processor hinzu dann 
kannst du mittels Breakpoint an einer stelle im Programm anhalten die 
Stoppuhr auf 0 setzen und beim nächten Breakpoint die Zeit ablesen die 
das ganze benötigt hat.

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.