Mikrocontroller und Digitale Elektronik
›
Thread
SoftPWM 8x8 mit ATMEGA8515 - need help
J
jmibk
Gast
01.07.2010 21:26
#1766896
Hallo,
habe ein kleines Problem mit einer 8x8 Matrix an einem ATMEGA8515 at
16MHz.
Ich habe 64 8 Bit Werte im RAM, die ich mit:
ldi R29,0 ;Y HIGH
ldi R28,DMX_FIELD ;Y LOW
ld R16, Y ;Y REG (RAM) IN R16 LADEN
aus dem RAM Lade. Je nachdem welchen Wert muss man halt DMX_FIELD+x
machen.
Die LED Kathoden hängen über 8 FETs an Port A, die Anoden über
Widerstände an Port B.
Jetzt gehts eigentlich nur darum, ganz Simpel im Hauptprogramm (kein
Timer!) die 64 Werte aus dem Ram zu laden und per PWM an die 8x8 Matrix
auszugeben. Igendwie funzt das aber nicht so recht.
1 /*
2 LINE:
3 //+OPERATIONEN LINE--------------------------------------------------------------------
4 inc PWMCOUNT ;TIMERVARIABLE FÜR PWM
5 //MULTIPLEX LINE
6 LSL PWM_MPX ;Multiplexline eins nach links
7 OUT PORTA,PWM_MPX ;porta ausgaben
8 CLR PWM_OUT
9 COLUMN:
10 //+OPERATIONEN COLUMN--------------------------------------------------------------
11 //RAM ADRESSE GRUNDWERT
12 ldi R29,0 ;Y HIGH
13 ldi R28,DMX_FIELD ;Y LOW
14 //RAM ADRESSE LINE
15 //LDI R16,8
16 //MUL R16,PWM_LINE ;Multiplikation
17 //ADD R28,R0 ;Ergebnis zu DMX Low
18 //RAM ADRESSE COLUMN
19 //ADD R28,PWM_COLUMN
20 //RAM LADEN
21 ld R16, Y ;Y REG (RAM) IN R16 LADEN,
22 //AUSGABE
23 CP R16,PWMCOUNT
24 BRLO PWM_FIN
25 OR PWM_OUT,PWM_MPX2
26 PWM_FIN:
27 LSL PWM_MPX2
28 //-OPERATIONEN COLUMN--------------------------------------------------------------
29 INC PWM_COLUMN ;Column um 1 erhöhen
30 CPI PWM_COLUMN,7
31 BRLO COLUMN
32 LDI PWM_COLUMN,0x00 ;Column wieder auf 0 stellen (im nächsten Lauf +1)
33 OUT PORTB,PWM_OUT
34 //-OPERATIONEN LINE--------------------------------------------------------------------
35 INC PWM_LINE ;Line um 1 erhöhen
36 CPI PWM_LINE,7 ;Wenn Line unter 8 [1 ... 8] wiederholen, wenn 8 auf 0 stellen
37 BRLO LINE
38 LDI PWM_LINE,0x00 ;Line wieder auf 0 stellen (im nächsten Lauf +1)
39
40 rjmp main*/
Hat jemand vielleicht ein paar Codeschnipsel oder sogar einen kompletten
Ansteuercode, um das Problem zu lösen?
So, ist zwar absolut unsauber programmiert aber es funzt, für alle, die
eventuell auch vor dem Problem stehen:
1 ;====================================================================================
2 ;=HAUPTPRGRAMM
3 ;====================================================================================
4 main:
5 ldi R28,DMX_FIELD ;Y LOW
6 ldi R29,0 ;Y HIGH
7
8 inc PWMCOUNT ;TIMERVARIABLE FÜR PWM
9 inc PWMCOUNT ;TIMERVARIABLE FÜR PWM
10
11 LINE:
12
13 //=========================COLUMN==================================================
14 CLR PWM_OUT
15 COLUMN:
16 //+OPERATIONEN COLUMN--------------------------------------------------------------
17 //RAM LADEN
18 LD R16, Y+ ;Y REG (RAM) IN R16 LADEN, RAM Adresse +1
19 //AUSGABE VORBEREITEN, PWM
20 CP PWMCOUNT,R16
21 BRSH PWM_FIN
22 OR PWM_OUT,PWM_COLUMN
23 PWM_FIN:
24 //NÄCHSTER WERT..
25 CPI PWM_COLUMN,0b10000000
26 BRNE NOT_OVER
27 LDI PWM_COLUMN,0x01
28 RJMP COLUMN_EXIT
29 NOT_OVER:
30 LSL PWM_COLUMN ;nach links schieben
31 RJMP COLUMN
32 COLUMN_EXIT:
33 //-OPERATIONEN COLUMN--------------------------------------------------------------
34
35 //=========================COLUMN==================================================
36
37 //------AUSGABE-------------------------------------------------------------------
38 ldi R16,0xff
39 OUT PORTA, R16 ;TRANSISTOREN
40 OUT PORTB, PWM_OUT ;ZEILENDATEN AUS RAM
41 COM PWM_LINE
42 OUT PORTA, PWM_LINE ;TRANSISTOREN
43 COM PWM_LINE
44
45 //NÄCHSTER WERT..
46 CPI PWM_LINE,0b10000000
47 BRLO NOT_OVER1
48 LDI PWM_LINE,0b00000001
49 RJMP LINE_EXIT
50 NOT_OVER1:
51 LSL PWM_LINE ;nach links schieben
52 RJMP LINE
53 LINE_EXIT:
54
55 rjmp main
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
Noch kein Account?
Die Registrierung ist kostenlos und dauert nur eine Minute.
Jetzt registrieren