Forum: Mikrocontroller und Digitale Elektronik SoftPWM 8x8 mit ATMEGA8515 - need help


von jmibk (Gast)


Lesenswert?

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?

von Michael J. (jmibk)


Lesenswert?

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

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.