Forum: Mikrocontroller und Digitale Elektronik asm für poti am adc auslessen


von Steril (Gast)


Lesenswert?

hallo, suche ein kleines asm programm, das einen am adc angeschlossenen
poti ausliest. habe hier nur was in C gefunden, was mir leider nichts
bringt.

danke,
Sterili

von Heinz (Gast)


Lesenswert?

- Datenblatt lesen, es gibt Unterschiede zwischen den AVR-Typen,
- ADMUX setzen (Eingang wählen),
- je nach AVR-Typ (siehe Datenblatt) ADC einschalten
  (anfangs am besten im Free-RUN-Modus),
- ADCL auslesen, ADCH auslesen,
- Werte verarbeiten...

MfG, Heinz

von thkais (Gast)


Lesenswert?

Jep, gib mal ein paar mehr Infos, was Du genau vor hast. Je nach
Anwendung kann es angenehmer sein, die Werte direkt auszulesen oder
"nebenbei" in einer Interrupt-Routine. Letzteres bevorzuge ich.

von Steril (Gast)


Lesenswert?

okay, sorry, also ein bisschen klarer...
möchte ganz ganz einfach nur die möglichst einfachste art und weise
sehen, wie man einen linearen poti(4,7 k-ohm) der sagen wir mal an Port
C angeschlossen ist ausliest. das ganze in asm, und lieber noch nicht
mit interrupts, weil so weit bin ich noch nicht ;)...also ganz einfache
loopschleife würde mir genügen.

dank, und gruß,
Michi

von Steril (Gast)


Lesenswert?

ach ja, und es handelt sich um einen 8515....

von Steril (Gast)


Lesenswert?

ich habe ein programm gefunden auf mc-project.de, dass glaub ich das
macht was ich meine, ist leider blos in c..weiß da jemand ein assembler
equivalent?

#include <avr/io.h>

int main (void) {

  int x = 0;
  ADCSRA =  _BV(ADEN) | _BV(ADPS2);
  //Aktivierung des ADC, festlegen eines Prescalers von 32 -->
4Mhz/32=125kHz
  //Starten einer einzelnen Konvertierung
  //Start einer Wandlung

  for (;;) {
    ADMUX =  _BV(MUX2);
    //Aktivierung des Pins PC5 (ADC5), an ihm soll die zu messende
Spannung liegen

    ADCSRA |= _BV(ADSC);
    //Start einer Konvertierung

    while (ADCSRA & _BV(ADSC)) {}
    //warte, bis ADSC gelöscht wird --> Ende der Konvertierung
    x = ADC;
  }
}

von Michael (Gast)


Lesenswert?

Der 8515 hat doch gar keinen AD-Wandler. Weder der Classik noch der
Mega. Am Port C liegt der Adressbus A8 bis A15.
Michael

von Steril (Gast)


Lesenswert?

Hehe, das kann dann natürlich nicht funktionieren ;)...
wenn ich sagen wir eine ATmega16 in mein stk500 einsetze, den ich auch
zuhause rumliegen habe, müsste es aber besser ausschauen (hab mich
gerade informiert;)...
weiß denn da jemand einen passenden einfachen "hallo welt" asm code?

danke

von billy (Gast)


Lesenswert?

Hallo Steril

versuchs mal hiermit:
http://www.elektronik-projekt.de/content/download/wie%20sag%20ichs%20meinem%20avr.pdf
das steht auch was über ADC drinnen. Ist zwar für den 4433 aber ich
mein mal das da kein so groser unterschied ist.

mfg
Max

von Steril (Gast)


Lesenswert?

cooler link, danke...

von Steril (Gast)


Lesenswert?

und es funktioniert...sehr schön...

von Steril (Gast)


Lesenswert?

so, hier der sourcecode für das ganze...
poti an port a, leds an port b...
+ lookuptable für eine auf und abgehende 8-led leiste








.include "m16def.inc"

.def temp   = r16
.def hibyte = r17
.def lobyte = r18
.def temp2   = r19

.def tabpos = r30
RESET:

;Z-Pointer
  ldi   ZL, LOW(daten*2)    ; Lo-Byte der Adresse in Z-Pointer
     ldi   ZH, HIGH(daten*2)   ; Hi-Byte der Adresse in Z-Pointer




     ldi   R16, 0xFF
     out   DDRB, R16            ; Port B als Ausgang konfiguriert
  ldi   R16, 0x00
  out   DDRD, R16      ; Port D als Eingang konfiguriert

  ldi    temp, 0xff
  out   PORTB, temp


  ldi   temp, 0        ; Kanal 0 des ADC aktiviert
  out   ADMUX, temp


  ;Bits setzen
  ldi    temp, ((1<<ADEN)|(1<<ADSC)|(1<<ADFR))+7
  out    ADCSR, temp




loop:
  sbi   ADCSR, ADIF ;(setze ADIF Bit im ADCSR Register)

Wait1:
  sbis   ADCSR, ADIF ;(Überspring nächsten Befehl wenn ADIF immer noch 1
ist)
  rjmp  wait1

  sbi    ADCSR, ADIF  ;(wenn ADIF-Bit weg dann nochmal: setze ADIF Bit 
im
ADCSR Register)

Wait2:
  sbis   ADCSR, ADIF
  rjmp   wait2


  in    lobyte, ADCL
  in    hibyte, ADCH


  ;Wert nach 2x rechts rollen, um 8 bit wert zu erhalten statt 10 bit
  ror    hibyte
  ror    lobyte
  ror    hibyte
  ror    lobyte

; lobyte wert durch 32 (2 hoch 5) dividieren,
; um einen wert von 0 - 7 zu kriegen.
; erreicht man durch 5 mal linksschieben


  lsr    lobyte
  lsr    lobyte
  lsr    lobyte
  lsr    lobyte
  lsr    lobyte



  mov   temp2, lobyte


; diese schleife erhöht den zpointer solange,
; bis er an dem wert des lobyte angekommen ist.


schleife:

  cpi   temp2, 0  ;if temp=0
  breq  schleifeE:  ;then goto schleifenEnde

  dec    temp2    ;schleifenzähler -1

  inc    tabpos    ;position erhöhen
  inc   tabpos    ;x2 !keine ahnung warum!

  rjmp  schleife  ;next


schleifeE:






  lpm                      ; durch Z-Pointer adressiertes Byte nach R0
lesen
    mov   temp, R0         ; nach temp kopieren

  com   temp      ; dieses invertieren

  out   PORTB, temp      ;und schlussendlich nach Port B rausgeben


  ldi   ZL, LOW (daten*2)    ; Z-Pointer Zurücksetzen
     ldi   ZH, HIGH(daten*2)

 rjmp loop


daten:
  .db  0b00000001
  .db  0b00000011
  .db  0b00000111
  .db  0b00001111
  .db  0b00011111
  .db  0b00111111
  .db  0b01111111
  .db  0b11111111

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.