asm für poti am adc auslessen

Gast #106053
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
Gast #106054
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.
Gast #106055
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
Gast #106057
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;
  }
}
Gast #106059
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
Gast #106063
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren