Forum: Mikrocontroller und Digitale Elektronik AVR Potentiometer schwankt total


von PeterNoPlan (Gast)


Lesenswert?

Hallo an Alle!

Ich habe es endlich geschafft bei meinem AVR Board Light die zwei 
Potentiometer anzuschließen und die Signale an meinen PCzu senden.

Das merkwürdige ist jetzt, dass nur einer der beiden konstant richtige 
werte liefert. Der andere schwankt enorm hin und her. Ich bin neu auf 
diesem Gebiet und habe keine Ahnung wodran es liegen könnte. Mit nur 
einem Potentiometer an dem AD Wandler angeschlossen hab ich keine 
Probleme...

Hier ist der Assembler Code den ich benutze:
1
;-------------------------------------------------------------------------
2
; Prozessor    : ATmega8
3
; Takt    : 3,6864 MHz
4
; Sprache    : Assembler
5
; Datum    : 26.10.2011
6
; Version    : 1.0
7
; Autor    :
8
;-------------------------------------------------------------------------
9
.include  "m8def.inc"
10
;----------------------------------------------------------------------
11
;Reset and Interruptvectoren  ;VNr.  Beschreibung
12
begin:
13
  rjmp  main  ; 1    POWER ON RESET
14
  reti    ; 2    Int0-Interrupt
15
  reti    ; 3    Int1-Interrupt
16
  reti    ; 4    TC2 Compare Match
17
  reti    ; 5    TC2 Overflow
18
  reti    ; 6    TC1 Capture
19
  reti    ; 7    TC1 Compare Match A
20
  reti    ; 8    TC1 Compare Match B
21
  reti    ; 9    TC1 Overflow
22
  reti    ;10    TC0 Overflow
23
  reti    ;11    SPI, STC Serial Transfer Complete
24
  reti    ;12    UART Rx Complete
25
  reti    ;13    UART Data Register Empty
26
  reti    ;14    UART Tx Complete
27
  reti    ;15    ADC Conversion Complete
28
  reti    ;16    EEPROM Ready
29
  reti    ;17    Analog Comperator
30
  reti    ;18    TWI (I²C) Serial Interface
31
  reti    ;19    Strore Program Memory Ready
32
;------------------------------------------------------------------------
33
;Start, Power ON, Reset
34
main:
35
  ldi  r16,high(RAMEND)
36
  out  SPH,r16
37
  ldi  r16,low(RAMEND)  ;Stack Initialisierung
38
  out  SPL,r16  ;Init Stackpointer
39
40
  sbi  UCSRB,3  ;USR=UCSRB=0x0A TXEN=Bit3 TX aktivieren
41
  ldi  r16,3686400/(9600*16)-1  ;Baudrate 9600 einstellen
42
  out  UBRRL,r16
43
44
  ldi  r16,0b00000000  ;PortC auf eingang
45
  out  DDRC,r16
46
47
  rjmp  mainloop
48
;----------------------------------------------------------------------
49
mainloop:
50
  rcall  messung1
51
  rjmp  mainloop
52
messung1:
53
  ldi  r16,0b10000000  ;Wandlung starten
54
  out  ADCSRA,r16
55
  sbi  ADCSR,ADSC
56
  ldi  r16,0b01000000  ;PortC.0 einlesen
57
  out  ADMUX,r16
58
  sbis  ADCSR,ADIF  ;Warten bis Wandlung beendet ist
59
  rjmp  messung1
60
  in  r17,ADCL  ;Die unteren 8 Bit in r17 merken
61
   in  r18,ADCH  ;Die oberen 8 Bit in r18 merken 
62
messung2:
63
  ldi  r16,0b10000000  ;Wandlung starten
64
  out  ADCSRA,r16
65
  sbi  ADCSR,ADSC
66
  ldi  r16,0b01000001  ;PortC.1 einlesen
67
  out  ADMUX,r16
68
  sbis  ADCSR,ADIF  ;Warten bis Wandlung beendet ist
69
  rjmp  messung2
70
  in  r19,ADCL  ;Die unteren 8 Bit in r19 merken
71
  in  r20,ADCH  ;Die oberen 8 Bit in r20 merken
72
;----------------------------------------------------------------------
73
testsendenhandshake:
74
  sbis  UCSRA,UDRE
75
  rjmp  testsendenhandshake
76
  ldi  r16,'S'
77
  out  UDR,r16
78
testsendenbyte1:
79
  sbis  UCSRA,UDRE
80
  rjmp  testsendenbyte1
81
  out  UDR,r17
82
testsendenbyte2:
83
  sbis  UCSRA,UDRE
84
  rjmp  testsendenbyte2
85
  out  UDR,r18
86
testsendenbyte3:
87
  sbis  UCSRA,UDRE
88
  rjmp  testsendenbyte3
89
  out  UDR,r19
90
testsendenbyte4:
91
  sbis  UCSRA,UDRE
92
  rjmp  testsendenbyte4
93
  out  UDR,r20
94
  rjmp  mainloop

Ist es ein Softwareproblem oder ien Hardwareproblem?

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

schau mal ins Datenblatt wie schnell der ADC-Takt nur sein darf und wie 
hoch er bei Dir ist.

Sascha

von Sebastian H. (pic_freak)


Lesenswert?

Kenn mich mit zwar mit AVR nicht gut aus, aber nochmalerweise muss du 
dem AD Port ein bißchen Zeit geben um sich zu stabilisieren. Wenn du zu 
schnell bist kommt nur Müll bei raus.

Was auch hilfreich ist mehrfach hintereinander einlesen und dann 
auswerten.

Schau auch das deine Eingangsbeschaltung dem Bsp. aus dem Datenblatt 
enspricht.

Gruß

Sebastian

von Krapao (Gast)


Lesenswert?

> Ist es ein Softwareproblem oder ien Hardwareproblem?

Hehe, du machst ja deinem Namen alle Ehre und verheimlichst den 
Schaltplan und bietest stattdessen nur ein Softwarelisting. Damit ist 
deine Frage eine Fangfrage geworden. Softwareproblem natürlich! Nee 
halt! Oder Hardwareproblem! Oder beides?

von PeterNoPlan (Gast)


Lesenswert?

Hallo Sascha!

Wie finde ich heraus wie schnell mei ADC-Takt ist? Ich bin ein totaler 
Neuling in der Microkontroller Programmierung :(

Bei dem ATmega8 gehen zwischen 50 und 200 kHz.

Peter

von Oliver J. (skriptkiddy)


Lesenswert?

Sollte man ADMUX nicht konfigurieren, bevor eine Wandlung startet?

Muss auf ein rcall kein ret folgen?

von PeterNoPlan (Gast)


Lesenswert?

Oh Entschuldige Krapao :D

Hier ist der Schaltplan von meinem AVR Board Light: 
http://www.myavr.info/download/produkte/myavr_board_light/techb_schaltplan-myavr-board-light.png

Also hilft es wenn ich einen kleinen delay nach dem portwechsel einfüge?

von Sascha W. (sascha-w)


Lesenswert?

PeterNoPlan schrieb:
> Hallo Sascha!
>
> Wie finde ich heraus wie schnell mei ADC-Takt ist? Ich bin ein totaler
> Neuling in der Microkontroller Programmierung :(
>
> Bei dem ATmega8 gehen zwischen 50 und 200 kHz.

jo, die untersten 3 Bit in ADCSRA sind die Taktteilerbits.
Bei dir sind alle 0 und damit ist der Teiler=2
3,386MHz / 2 = 1,84MHz

dein Teiler sollte mid. 32 betragen => 115kHz
damit müssen die unteren 3 Bits in ADCSRA 101 sein (siehe Seite 205)

Sascha

von PeterNoPlan (Gast)


Lesenswert?

Okay also ich hab das mal mit dem rcall und dem reti bereinigt. Auch das 
mit den Taktteilerbits habe ich glaube ich korrekt gelöst. Wo genau muss 
ich jetzt eine Verzögerung reinmachen, damit die 2. AD Wandlung nicht 
immer zwischen o und dem richtigen Wert springt?

direkt nach dem ADMUX Befehl?
1
;-------------------------------------------------------------------------
2
; Titel    : myAVR Beispiel "UART senden" für den ATmega8
3
;-------------------------------------------------------------------------
4
; Funktion    : sendet den String "Test" mit 9600 Baud per serieller
5
;    : Schnittstelle
6
; Schaltung    : Nullmodemkabel an PC & AVR-Board
7
;-------------------------------------------------------------------------
8
; Prozessor    : ATmega8
9
; Takt    : 3,6864 MHz
10
; Sprache    : Assembler
11
; Datum    : 26.10.2011
12
; Version    : 1.0
13
; Autor    : Jan Rose
14
;-------------------------------------------------------------------------
15
.include  "m8def.inc"
16
;----------------------------------------------------------------------
17
;Reset and Interruptvectoren  ;VNr.  Beschreibung
18
begin:
19
  rjmp  main  ; 1    POWER ON RESET
20
  reti    ; 2    Int0-Interrupt
21
  reti    ; 3    Int1-Interrupt
22
  reti    ; 4    TC2 Compare Match
23
  reti    ; 5    TC2 Overflow
24
  reti    ; 6    TC1 Capture
25
  reti    ; 7    TC1 Compare Match A
26
  reti    ; 8    TC1 Compare Match B
27
  reti    ; 9    TC1 Overflow
28
  reti    ;10    TC0 Overflow
29
  reti    ;11    SPI, STC Serial Transfer Complete
30
  reti    ;12    UART Rx Complete
31
  reti    ;13    UART Data Register Empty
32
  reti    ;14    UART Tx Complete
33
  reti    ;15    ADC Conversion Complete
34
  reti    ;16    EEPROM Ready
35
  reti    ;17    Analog Comperator
36
  reti    ;18    TWI (I²C) Serial Interface
37
  reti    ;19    Strore Program Memory Ready
38
;------------------------------------------------------------------------
39
;Start, Power ON, Reset
40
main:
41
  ldi  r16,high(RAMEND)
42
  out  SPH,r16
43
  ldi  r16,low(RAMEND)  ;Stack Initialisierung
44
  out  SPL,r16  ;Init Stackpointer
45
46
  sbi  UCSRB,3  ;USR=UCSRB=0x0A TXEN=Bit3 TX aktivieren
47
  ldi  r16,3686400/(9600*16)-1  ;Baudrate 9600 einstellen
48
  out  UBRRL,r16
49
50
  ldi  r16,0b00000000  ;PortC auf eingang
51
  out  DDRC,r16
52
53
  rjmp  mainloop
54
;----------------------------------------------------------------------
55
mainloop:
56
  rcall  messung1
57
  rcall  messung2
58
  rcall  testsendenhandshake
59
  rjmp  mainloop
60
messung1:
61
  ldi  r16,0b10000101  ;Wandlung starten
62
  out  ADCSRA,r16
63
  sbi  ADCSR,ADSC
64
  ldi  r16,0b01000000  ;PortC.0 einlesen
65
  out  ADMUX,r16
66
  sbis  ADCSR,ADIF  ;Warten bis Wandlung beendet ist
67
  rjmp  messung1
68
  in  r17,ADCL  ;Die unteren 8 Bit in r17 merken
69
  in  r18,ADCH  ;Die oberen 8 Bit in r18 merken
70
  reti
71
messung2:
72
  ldi  r16,0b10000101  ;Wandlung starten
73
  out  ADCSRA,r16
74
  sbi  ADCSR,ADSC
75
  ldi  r16,0b01000001  ;PortC.1 einlesen
76
  out  ADMUX,r16
77
  sbis  ADCSR,ADIF  ;Warten bis Wandlung beendet ist
78
  rjmp  messung2
79
  in  r19,ADCL  ;Die unteren 8 Bit in r19 merken
80
  in  r20,ADCH  ;Die oberen 8 Bit in r20 merken
81
  reti
82
;----------------------------------------------------------------------
83
testsendenhandshake:
84
  sbis  UCSRA,UDRE
85
  rjmp  testsendenhandshake
86
  ldi  r16,'S'
87
  out  UDR,r16
88
testsendenbyte1:
89
  sbis  UCSRA,UDRE
90
  rjmp  testsendenbyte1
91
  out  UDR,r17
92
testsendenbyte2:
93
  sbis  UCSRA,UDRE
94
  rjmp  testsendenbyte2
95
  out  UDR,r18
96
testsendenbyte3:
97
  sbis  UCSRA,UDRE
98
  rjmp  testsendenbyte3
99
  out  UDR,r19
100
testsendenbyte4:
101
  sbis  UCSRA,UDRE
102
  rjmp  testsendenbyte4
103
  out  UDR,r20
104
  ret

von Skua C. (skua)


Lesenswert?

PeterNoPlan schrieb:
>   ldi  r16,0b10000101  ;Wandlung starten
>   out  ADCSRA,r16
>   sbi  ADCSR,ADSC
>   ldi  r16,0b01000000  ;PortC.0 einlesen
>   out  ADMUX,r16

Oliver J. schrieb:
> Sollte man ADMUX nicht konfigurieren, bevor eine Wandlung startet?

Sehe ich auch so.

von PeterNoPlan (Gast)


Lesenswert?

@Skua

Und wo fang ich da an :D? Was meinst du mit konfigurieren?

von Skua C. (skua)


Lesenswert?

Versuch mal so.
1
   ldi  r16,0b01000000  ;PortC.0 einlesen
2
   out  ADMUX,r16
3
   ldi  r16,0b10000101  ;Wandlung starten
4
   out  ADCSRA,r16
5
   sbi  ADCSR,ADSC

PeterNoPlan schrieb:
> Was meinst du mit konfigurieren?

Gemeint ist das beschreiben des Registers

von PeterNoPlan (Gast)


Lesenswert?

Skua C:\> schrieb:
> Versuch mal so.
>    ldi  r16,0b01000000  ;PortC.0 einlesen
>    out  ADMUX,r16
>    ldi  r16,0b10000101  ;Wandlung starten
>    out  ADCSRA,r16
>    sbi  ADCSR,ADSC
>
> PeterNoPlan schrieb:
>> Was meinst du mit konfigurieren?
>
> Gemeint ist das beschreiben des Registers

Okay danke! Trotzdem bleibt das Problem weiterhin bestehen. Wo muss ich 
jetzt eine Verzögerung einfügen, damit der ADMUX sich erholen kann?

von Oliver J. (skriptkiddy)


Lesenswert?

Aktiviert reti nicht global die Interrupts? Sollte man das wirklich 
verwenden, um eine Subroutine zu verlassen?

von PeterNoPlan (Gast)


Lesenswert?

Oliver J. schrieb:
> Aktiviert reti nicht global die Interrupts? Sollte man das wirklich
> verwenden, um eine Subroutine zu verlassen?

Jetzt bin ich noch verwirrter :D Eben hies es doch noch ich soll immer 
mit reti einen rcall abschließen...

von Oliver J. (skriptkiddy)


Lesenswert?

PeterNoPlan schrieb:
> Jetzt bin ich noch verwirrter :D Eben hies es doch noch ich soll immer
> mit reti einen rcall abschließen...

Wer schreibt das?

von PeterNoPlan (Gast)


Lesenswert?

Oliver J. schrieb:
> PeterNoPlan schrieb:
>> Jetzt bin ich noch verwirrter :D Eben hies es doch noch ich soll immer
>> mit reti einen rcall abschließen...
>
> Wer schreibt das?

Oh Tatsache! Habe mich verlesen... anstatt ret hab ich reti 
geschrieben...
Löst trotzdem mein Problem nicht :(

von Oliver J. (skriptkiddy)


Lesenswert?

PeterNoPlan schrieb:
> Löst trotzdem mein Problem nicht :(
Hätte mich auch gewundert. :)

Versuch das Warten aufs Ergebnis mal so (auch bei Messung1):
1
messung2:
2
  [...]
3
wait2:
4
  sbis  ADCSR,ADIF  ;Warten bis Wandlung beendet ist
5
  rjmp  wait2

von spess53 (Gast)


Lesenswert?

Hi

>  sbis  ADCSR,ADIF  ;Warten bis Wandlung beendet ist

Was soll denn die Abfrage von ADIF?

Datenblatt:

ADSC will read as one as long as a conversion is in progress. When the 
conversion is complete, it returns to zero.

Also Frage ADSC ab. ADIF musst du nämlich auch noch per Hand 
zurückstellen.

MfG Spess

von PeterNoPlan (Gast)


Lesenswert?

Oliver J. schrieb:
> PeterNoPlan schrieb:
>> Löst trotzdem mein Problem nicht :(
> Hätte mich auch gewundert. :)
>
> Versuch das Warten aufs Ergebnis mal so (auch bei Messung1):messung2:
>   [...]
> wait2:
>   sbis  ADCSR,ADIF  ;Warten bis Wandlung beendet ist
>   rjmp  wait2

Hmm scheint auch nicht zu gehen:
1
;-------------------------------------------------------------------------
2
; Prozessor    : ATmega8
3
; Takt    : 3,6864 MHz
4
; Sprache    : Assembler
5
; Datum    : 26.10.2011
6
; Version    : 1.0
7
; Autor    : Jan Rose
8
;-------------------------------------------------------------------------
9
.include  "m8def.inc"
10
;----------------------------------------------------------------------
11
;Reset and Interruptvectoren  ;VNr.  Beschreibung
12
begin:
13
  rjmp  main  ; 1    POWER ON RESET
14
  reti    ; 2    Int0-Interrupt
15
  reti    ; 3    Int1-Interrupt
16
  reti    ; 4    TC2 Compare Match
17
  reti    ; 5    TC2 Overflow
18
  reti    ; 6    TC1 Capture
19
  reti    ; 7    TC1 Compare Match A
20
  reti    ; 8    TC1 Compare Match B
21
  reti    ; 9    TC1 Overflow
22
  reti    ;10    TC0 Overflow
23
  reti    ;11    SPI, STC Serial Transfer Complete
24
  reti    ;12    UART Rx Complete
25
  reti    ;13    UART Data Register Empty
26
  reti    ;14    UART Tx Complete
27
  reti    ;15    ADC Conversion Complete
28
  reti    ;16    EEPROM Ready
29
  reti    ;17    Analog Comperator
30
  reti    ;18    TWI (I²C) Serial Interface
31
  reti    ;19    Strore Program Memory Ready
32
;------------------------------------------------------------------------
33
;Start, Power ON, Reset
34
main:
35
  ldi  r16,high(RAMEND)
36
  out  SPH,r16
37
  ldi  r16,low(RAMEND)  ;Stack Initialisierung
38
  out  SPL,r16  ;Init Stackpointer
39
40
  sbi  UCSRB,3  ;USR=UCSRB=0x0A TXEN=Bit3 TX aktivieren
41
  ldi  r16,3686400/(9600*16)-1  ;Baudrate 9600 einstellen
42
  out  UBRRL,r16
43
44
  ldi  r16,0b00000000  ;PortC auf eingang
45
  out  DDRC,r16
46
47
  rjmp  mainloop
48
;----------------------------------------------------------------------
49
mainloop:
50
  rcall  messung1
51
  rcall  messung2
52
  rcall  testsendenhandshake
53
  rjmp  mainloop
54
messung1:
55
  ldi  r16,0b01000000  ;PortC.0 einlesen
56
  out  ADMUX,r16
57
  ldi  r16,0b10000101  ;Wandlung starten
58
  out  ADCSRA,r16
59
  sbi  ADCSR,ADSC
60
wait1:
61
  sbis  ADCSR,ADIF  ;Warten bis Wandlung beendet ist
62
  rjmp  wait1
63
  in  r17,ADCL  ;Die unteren 8 Bit in r17 merken
64
  in  r18,ADCH  ;Die oberen 8 Bit in r18 merken
65
  ret
66
messung2:
67
  ldi  r16,0b01000001  ;PortC.1 einlesen
68
  out  ADMUX,r16
69
  ldi  r16,0b10000101  ;Wandlung starten
70
  out  ADCSRA,r16
71
  sbi  ADCSR,ADSC
72
wait2:
73
  sbis  ADCSR,ADIF  ;Warten bis Wandlung beendet ist
74
  rjmp  wait2
75
  in  r19,ADCL  ;Die unteren 8 Bit in r19 merken
76
  in  r20,ADCH  ;Die oberen 8 Bit in r20 merken
77
  ret
78
;----------------------------------------------------------------------
79
testsendenhandshake:
80
  sbis  UCSRA,UDRE
81
  rjmp  testsendenhandshake
82
  ldi  r16,'S'
83
  out  UDR,r16
84
testsendenbyte1:
85
  sbis  UCSRA,UDRE
86
  rjmp  testsendenbyte1
87
  out  UDR,r17
88
testsendenbyte2:
89
  sbis  UCSRA,UDRE
90
  rjmp  testsendenbyte2
91
  out  UDR,r18
92
testsendenbyte3:
93
  sbis  UCSRA,UDRE
94
  rjmp  testsendenbyte3
95
  out  UDR,r19
96
testsendenbyte4:
97
  sbis  UCSRA,UDRE
98
  rjmp  testsendenbyte4
99
  out  UDR,r20
100
  ret

von PeterNoPlan (Gast)


Lesenswert?

spess53 schrieb:
> Hi
>
>>  sbis  ADCSR,ADIF  ;Warten bis Wandlung beendet ist
>
> Was soll denn die Abfrage von ADIF?
>
> Datenblatt:
>
> ADSC will read as one as long as a conversion is in progress. When the
> conversion is complete, it returns to zero.
>
> Also Frage ADSC ab. ADIF musst du nämlich auch noch per Hand
> zurückstellen.
>
> MfG Spess

Wenn ich ADSC abfrage funktioniert nurnoch einer der beiden 
Potentiometer. Das kann doch nicht sein :(
Ich verzweifel gerade wirklich...

Hat nicht jemand zufällig ein Beispielcode um 2 Analoge WErte zum PC zu 
schicken?

von AVR-User (Gast)


Lesenswert?

Hallo,

>  sbis  ADCSR,ADSC ;Warten bis Wandlung beendet ist
>  rjmp  ...

Das scheint mir nicht korrekt zu sein; hier sollte es eher lauten:

>>  sbic  ADCSR,ADSC  ;Warten bis Wandlung beendet ist
>>  rjmp  ...

Schliesslich wird das ADSC-Bit am Ende der Wandlung zurückgesetzt, und 
erst dann soll es weitergehen ...

Und das "reti" am Ende der Messungs-Routinen sollte durch ein "ret" 
ersetzt werden, denn das "reti" beendet eine Interrupt-Routine (auch 
wenn das "reti" hier auch funktionieren würde, da keine Interrupts 
freigegeben sind).

von PeterNoPlan (Gast)


Angehängte Dateien:

Lesenswert?

Hallo an alle! Ich habe das Problem mit den 2 Potentiometern noch immer 
nicht gelöst.

Ich bekomme zwar korrekte Werte von dem einen doch der andere ist 
einfach nur komisch...

Er gibt als minimalwert immer 15 aus. Außerdem springt der Wert nach 3-5 
korrekten werten immer auf 0 zurück und dann geht es wieder von vorne 
los...

Ich habe ein Screenshot angehängt, damit ihr sehen könnt, was ich meine.

Im folgenden ist natürlich mein derzeitiger Assembler Code:
1
;-------------------------------------------------------------------------
2
; Prozessor    : ATmega8
3
; Takt    : 3,6864 MHz
4
; Sprache    : Assembler
5
;-------------------------------------------------------------------------
6
.include  "m8def.inc"
7
;----------------------------------------------------------------------
8
;Reset and Interruptvectoren  ;VNr.  Beschreibung
9
begin:
10
  rjmp  main  ; 1    POWER ON RESET
11
  reti    ; 2    Int0-Interrupt
12
  reti    ; 3    Int1-Interrupt
13
  reti    ; 4    TC2 Compare Match
14
  reti    ; 5    TC2 Overflow
15
  reti    ; 6    TC1 Capture
16
  reti    ; 7    TC1 Compare Match A
17
  reti    ; 8    TC1 Compare Match B
18
  reti    ; 9    TC1 Overflow
19
  reti    ;10    TC0 Overflow
20
  reti    ;11    SPI, STC Serial Transfer Complete
21
  reti    ;12    UART Rx Complete
22
  reti    ;13    UART Data Register Empty
23
  reti    ;14    UART Tx Complete
24
  reti    ;15    ADC Conversion Complete
25
  reti    ;16    EEPROM Ready
26
  reti    ;17    Analog Comperator
27
  reti    ;18    TWI (I²C) Serial Interface
28
  reti    ;19    Strore Program Memory Ready
29
;------------------------------------------------------------------------
30
;Start, Power ON, Reset
31
main:
32
  ldi  r16,high(RAMEND)
33
  out  SPH,r16
34
  ldi  r16,low(RAMEND)  ;Stack Initialisierung
35
  out  SPL,r16  ;Init Stackpointer
36
37
  sbi  UCSRB,3  ;USR=UCSRB=0x0A TXEN=Bit3 TX aktivieren
38
  ldi  r16,3686400/(9600*16)-1  ;Baudrate 9600 einstellen
39
  out  UBRRL,r16
40
41
  ldi  r16,0b00000000  ;PortC auf eingang
42
  out  DDRC,r16
43
44
  rjmp  mainloop
45
;----------------------------------------------------------------------
46
mainloop:
47
  rcall  messung1
48
  rcall  messung2
49
  rcall  senden
50
  rjmp  mainloop
51
messung1:
52
  ldi  r16,0b01000000  ;PortC.0 einlesen
53
  out  ADMUX,r16
54
  ldi  r16,0b11100101  ;Wandlung starten
55
  out  ADCSRA,r16
56
  sbi  ADCSR,ADSC
57
wait1:
58
  sbis  ADCSR,ADIF  ;Warten bis Wandlung beendet ist
59
  rjmp  wait1
60
  in  r17,ADCL  ;Die unteren 8 Bit in r17 merken
61
  in  r18,ADCH  ;Die oberen 8 Bit in r18 merken
62
  ret
63
messung2:
64
  ldi  r16,0b01000001  ;PortC.1 einlesen
65
  out  ADMUX,r16
66
  ldi  r16,0b11100101  ;Wandlung starten
67
  out  ADCSRA,r16
68
  sbi  ADCSR,ADSC
69
wait2:
70
  sbis  ADCSR,ADIF  ;Warten bis Wandlung beendet ist
71
  rjmp  wait2
72
  in  r19,ADCL  ;Die unteren 8 Bit in r19 merken
73
  in  r20,ADCH  ;Die oberen 8 Bit in r20 merken
74
  ret
75
;----------------------------------------------------------------------
76
senden:
77
  sbis  UCSRA,UDRE
78
  rjmp  senden
79
  ldi  r16,'S'
80
  out  UDR,r16
81
senden2:
82
  sbis  UCSRA,UDRE
83
  rjmp  senden2
84
  out  UDR,r17
85
senden3:
86
  sbis  UCSRA,UDRE
87
  rjmp  senden3
88
  out  UDR,r18
89
senden4:
90
  sbis  UCSRA,UDRE
91
  rjmp  senden4
92
  out  UDR,r19
93
senden5:
94
  sbis  UCSRA,UDRE
95
  rjmp  senden5
96
  out  UDR,r20
97
  ret

von spess53 (Gast)


Lesenswert?

HI

>  sbis  ADCSR,ADIF  ;Warten bis Wandlung beendet ist

Beratungsresistent?

MfG Spess

von PeterNoPlan (Gast)


Lesenswert?

spess53 schrieb:
> HI
>
>>  sbis  ADCSR,ADIF  ;Warten bis Wandlung beendet ist
>
> Beratungsresistent?
>
> MfG Spess

Nicht wirklich. Ich habe es mit sbic getestet aber danach kam garnichts 
mehr an.

von PeterNoPlan (Gast)


Lesenswert?

@Spess

Wenn ich anstatt ADIF -> ADSC abfrage funktioniert nurnoch ein 
Potentiometer

von Klaus D. (kolisson)


Lesenswert?

poti kaputt

k.

von PeterNoPlan (Gast)


Lesenswert?

Klaus De lisson schrieb:
> poti kaputt
>
> k.

Ich habe das Programm mit einer anderen baugleichen Platine getestet und 
bekomme den selben Fehler.

von Martin (Gast)


Lesenswert?

schließ doch mal die Hardware aus, indem du die Potis an den 
ADC-Eingängen tauschst. Oder du kommentierst den funktionierenden im 
Programm aus.

Damit kannst du doch rausbekommen, ob es ein Hardwareproblem ist oder ob 
die zwei ADC-Abfragen im Programm schuld sind.

Du weißt dann zumindest das beide Poti unabhängig voneinander 
funktionieren.

von Informer (Gast)


Lesenswert?

>  out  ADCSRA,r16
>  sbi  ADCSR,ADSC
            ^^
Warum zwei verschiedene Registernamen? Die korrekte Bezeichnung des 
ADC-Steuerregisters ist "ADCSRA" (in beiden Fällen).

>  ldi  r16,0b11100101  ;Wandlung starten
>  out  ADCSRA,r16
>  sbi  ADCSR,ADSC

Hier werden im Steuerregister einige "falsche" Bits gesetzt. Bei der 
unschönen Binärdarstellung ist dies nur schwer erkennbar:
- Das Bit "ADFR" ist gesetzt; für den Single-Betrieb nicht korrekt (auf 
0 setzen)
- Der ADC wird zweimal getriggert. Einmal durch Schreiben des ganzen 
Registers (Bit "ADSC" ist hier gesetzt) und noch mal durch explizites 
Setzen von ADSC. Hier sollte beim Schreiben von ADCSRA das "ADSC" Bit 0 
sein.
Also so wie hier:
1
messung1:
2
  ldi  r16,0b01000000  ;PortC.0 einlesen
3
  out  ADMUX,r16
4
  ldi  r16,0b10000101  ;Wandlung starten
5
  out  ADCSRA,r16
6
  sbi  ADCSRA,ADSC
7
wait1:
8
  sbic  ADCSRA,ADSC  ;Warten bis Wandlung beendet ist
9
  rjmp  wait1
10
  ...

MfG

von PeterNoPlan (Gast)


Lesenswert?

Okay, ich habe jetzt mal die Potis vertausch und jetzt funktioniert der 
ander nicht mehr, weshalb ich einen Hardwaredefekt ausschließe.

ist der Quellcode so jetzt richtig?
1
;-------------------------------------------------------------------------
2
.include  "m8def.inc"
3
;----------------------------------------------------------------------
4
;Reset and Interruptvectoren  ;VNr.  Beschreibung
5
begin:
6
  rjmp  main  ; 1    POWER ON RESET
7
  reti    ; 2    Int0-Interrupt
8
  reti    ; 3    Int1-Interrupt
9
  reti    ; 4    TC2 Compare Match
10
  reti    ; 5    TC2 Overflow
11
  reti    ; 6    TC1 Capture
12
  reti    ; 7    TC1 Compare Match A
13
  reti    ; 8    TC1 Compare Match B
14
  reti    ; 9    TC1 Overflow
15
  reti    ;10    TC0 Overflow
16
  reti    ;11    SPI, STC Serial Transfer Complete
17
  reti    ;12    UART Rx Complete
18
  reti    ;13    UART Data Register Empty
19
  reti    ;14    UART Tx Complete
20
  reti    ;15    ADC Conversion Complete
21
  reti    ;16    EEPROM Ready
22
  reti    ;17    Analog Comperator
23
  reti    ;18    TWI (I²C) Serial Interface
24
  reti    ;19    Strore Program Memory Ready
25
;------------------------------------------------------------------------
26
;Start, Power ON, Reset
27
main:
28
  ldi  r16,high(RAMEND)
29
  out  SPH,r16
30
  ldi  r16,low(RAMEND)  ;Stack Initialisierung
31
  out  SPL,r16  ;Init Stackpointer
32
33
  sbi  UCSRB,3  ;USR=UCSRB=0x0A TXEN=Bit3 TX aktivieren
34
  ldi  r16,3686400/(9600*16)-1  ;Baudrate 9600 einstellen
35
  out  UBRRL,r16
36
37
  ldi  r16,0b00000000  ;PortC auf eingang
38
  out  DDRC,r16
39
40
  rjmp  mainloop
41
;----------------------------------------------------------------------
42
mainloop:
43
  rcall  messung1
44
  rcall  messung2
45
  rcall  senden
46
  rjmp  mainloop
47
messung1:
48
  ldi  r16,0b01000000  ;PortC.0 einlesen
49
  out  ADMUX,r16
50
  ldi   r16,0b10000101  ;Wandlung starten
51
  out  ADCSRA,r16
52
  sbi  ADCSRA,ADSC
53
  nop
54
wait1:
55
  sbis  ADCSR,ADIF  ;Warten bis Wandlung beendet ist
56
  rjmp  wait1
57
  in  r17,ADCL  ;Die unteren 8 Bit in r17 merken
58
  in  r18,ADCH  ;Die oberen 8 Bit in r18 merken
59
  ret
60
messung2:
61
  ldi  r16,0b01000001  ;PortC.1 einlesen
62
  out  ADMUX,r16
63
  ldi   r16,0b10000101  ;Wandlung starten
64
  out  ADCSRA,r16
65
  sbi  ADCSRA,ADSC
66
  nop
67
wait2:
68
  sbis  ADCSR,ADIF  ;Warten bis Wandlung beendet ist
69
  rjmp  wait2
70
  in  r19,ADCL  ;Die unteren 8 Bit in r19 merken
71
  in  r20,ADCH  ;Die oberen 8 Bit in r20 merken
72
  ret
73
;----------------------------------------------------------------------
74
senden:
75
  sbis  UCSRA,UDRE
76
  rjmp  senden
77
  ldi  r16,'S'
78
  out  UDR,r16
79
senden2:
80
  sbis  UCSRA,UDRE
81
  rjmp  senden2
82
  out  UDR,r17
83
senden3:
84
  sbis  UCSRA,UDRE
85
  rjmp  senden3
86
  out  UDR,r18
87
senden4:
88
  sbis  UCSRA,UDRE
89
  rjmp  senden4
90
  out  UDR,r19
91
senden5:
92
  sbis  UCSRA,UDRE
93
  rjmp  senden5
94
  out  UDR,r20
95
  re

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.