mikrocontroller.net

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


Autor: Steril (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Steril (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steril (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach ja, und es handelt sich um einen 8515....

Autor: Steril (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
  }
}

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steril (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: billy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Steril

versuchs mal hiermit:
http://www.elektronik-projekt.de/content/download/...
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

Autor: Steril (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
cooler link, danke...

Autor: Steril (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und es funktioniert...sehr schön...

Autor: Steril (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.