mikrocontroller.net

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


Autor: jmibk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
/*
LINE:
  //+OPERATIONEN LINE--------------------------------------------------------------------
  inc   PWMCOUNT    ;TIMERVARIABLE FÜR PWM
    //MULTIPLEX LINE
    LSL    PWM_MPX        ;Multiplexline eins nach links
    OUT    PORTA,PWM_MPX    ;porta ausgaben
    CLR    PWM_OUT
    COLUMN:
      //+OPERATIONEN COLUMN--------------------------------------------------------------
        //RAM ADRESSE GRUNDWERT
          ldi    R29,0        ;Y HIGH
          ldi    R28,DMX_FIELD    ;Y LOW
        //RAM ADRESSE LINE
          //LDI    R16,8      
          //MUL    R16,PWM_LINE  ;Multiplikation
          //ADD    R28,R0      ;Ergebnis zu DMX Low        
        //RAM ADRESSE COLUMN    
          //ADD    R28,PWM_COLUMN
        //RAM LADEN
        ld    R16, Y        ;Y REG (RAM) IN R16 LADEN,
      //AUSGABE
        CP    R16,PWMCOUNT
        BRLO  PWM_FIN
          OR  PWM_OUT,PWM_MPX2  
        PWM_FIN:
      LSL    PWM_MPX2
      //-OPERATIONEN COLUMN--------------------------------------------------------------
      INC    PWM_COLUMN    ;Column um 1 erhöhen
      CPI    PWM_COLUMN,7
      BRLO  COLUMN
      LDI    PWM_COLUMN,0x00  ;Column wieder auf 0 stellen (im nächsten Lauf +1)
      OUT    PORTB,PWM_OUT
  //-OPERATIONEN LINE--------------------------------------------------------------------
  INC    PWM_LINE    ;Line um 1 erhöhen
  CPI    PWM_LINE,7    ;Wenn Line unter 8 [1 ... 8] wiederholen, wenn 8 auf 0 stellen
  BRLO  LINE
  LDI    PWM_LINE,0x00  ;Line wieder auf 0 stellen (im nächsten Lauf +1)
  
rjmp  main*/

Hat jemand vielleicht ein paar Codeschnipsel oder sogar einen kompletten 
Ansteuercode, um das Problem zu lösen?

Autor: Michael Juen (jmibk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, ist zwar absolut unsauber programmiert aber es funzt, für alle, die 
eventuell auch vor dem Problem stehen:
;====================================================================================
;=HAUPTPRGRAMM
;====================================================================================
main:
ldi    R28,DMX_FIELD    ;Y LOW
ldi    R29,0        ;Y HIGH

inc   PWMCOUNT    ;TIMERVARIABLE FÜR PWM
inc   PWMCOUNT    ;TIMERVARIABLE FÜR PWM

LINE:

//=========================COLUMN==================================================
  CLR    PWM_OUT
COLUMN:
//+OPERATIONEN COLUMN--------------------------------------------------------------
  //RAM LADEN
    LD    R16, Y+        ;Y REG (RAM) IN R16 LADEN, RAM Adresse +1
  //AUSGABE VORBEREITEN, PWM
    CP    PWMCOUNT,R16
    BRSH  PWM_FIN
      OR  PWM_OUT,PWM_COLUMN
    PWM_FIN:
  //NÄCHSTER WERT..
    CPI  PWM_COLUMN,0b10000000
    BRNE NOT_OVER
    LDI  PWM_COLUMN,0x01
    RJMP COLUMN_EXIT
  NOT_OVER:
    LSL PWM_COLUMN    ;nach links schieben
      RJMP   COLUMN   
  COLUMN_EXIT:
//-OPERATIONEN COLUMN--------------------------------------------------------------

//=========================COLUMN==================================================

//------AUSGABE-------------------------------------------------------------------
ldi R16,0xff
OUT   PORTA, R16  ;TRANSISTOREN
  OUT    PORTB, PWM_OUT  ;ZEILENDATEN AUS RAM
COM PWM_LINE
  OUT   PORTA, PWM_LINE  ;TRANSISTOREN
COM PWM_LINE

  //NÄCHSTER WERT..
    CPI  PWM_LINE,0b10000000
    BRLO NOT_OVER1
    LDI  PWM_LINE,0b00000001
    RJMP LINE_EXIT
  NOT_OVER1:
    LSL PWM_LINE    ;nach links schieben
    RJMP LINE
  LINE_EXIT:
    
rjmp  main

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.