Gibt es für diesen Fehler noch keine Lösung?
So Leute, kämpfe mit dem gleiche Problem wie hier beschrieben, kann egal was ich mache nur adc 0-7 lesen.
Gibt es dafür schon ne Lösung?
Code:$prog , 255 , &B11011001 , 'Quarz an / Teiler aus / Jtag aus $regfile = "m2560def.dat" $hwstack = 82 '80 $framesize = 68 ' 64 $swstack = 68 '44 $crystal = 16000000 'Quarzfrequenz Config Pind.5 = Output Led Alias Portd.5 $baud = 57600 Dim Kanal As Byte Dim X As Word '*** RS232 Protokoll *** Const Tz = "," ' *** ADC *** Config Adc = Single , Prescaler = Auto , Reference = Internal_1.1 Start Adc '*** Hauptschleife *** Do Kanal = 0 Print "*" ; Tz; Led = 0 Adcsrb.mux5 = 0 Waitms 100 For Kanal = 0 To 7 X = Getadc(kanal) Print X ; Tz; Next Kanal Adcsrb.mux5 = 1 Kanal = 0 Waitms 100 For Kanal = 0 To 7 X = Getadc(kanal) Print X ; Tz; Next Kanal Led = 1 Print "#" ; Tz Loop End
Gibt es für diesen Fehler noch keine Lösung?
Solange es von MCS kein Update gibt, gibts nur ein Workaround, nämlich den GetAdc selber proggen.
Hier nochmal warum es mit dem Workaround MUX5 setzen auch nicht mehr geht (in ASM):
Bei jedem GetADC wird MUX5 gelöscht, und immer noch die falsche KanalNr bei > 7 mitgegeben !Code:'W = Getadc(10) +000000AA: 9100007C LDS R16,0x007C ADMUX +000000AC: 7E00 ANDI R16,0xE0 Bits 0-4 löschen +000000AD: 9110007B LDS R17,0x007B ADCSRB +000000AF: 7F17 ANDI R17,0xF7 MUX5 löschen +000000B0: 600A ORI R16,0x0A Kanalnr. !! +000000B1: 9310007B STS 0x007B,R17 ADCSRB +000000B3: 9300007C STS 0x007C,R16 ADMUX +000000B5: 940E00C8 CALL 0x000000C8 GETADC aufrufen .... ' GetADC +000000C8: 9170007A LDS R23,0x007A ADCSRA +000000CA: 6470 ORI R23,0x40 ADSC setzen +000000CB: 9370007A STS 0x007A,R23 ADCSRA +000000CD: 9000007A LDS R0,0x007A ADCSRA +000000CF: FC06 SBRC R0,6 Skip if bit ADSC in register cleared +000000D0: CFFC RJMP PC-0x0003 Relative jump +000000D1: 9170007A LDS R23,0x007A ADCSRA +000000D3: 6470 ORI R23,0x40 ADSC setzen +000000D4: 9370007A STS 0x007A,R23 ADCSRA +000000D6: 9000007A LDS R0,0x007A ADCSRA +000000D8: FC06 SBRC R0,6 Skip if bit ADSC in register cleared +000000D9: CFFC RJMP PC-0x0003 Relative jump +000000DA: 91800078 LDS R24,0x0078 ADCL +000000DC: 91900079 LDS R25,0x0079 ADCH +000000DE: 9508 RET Subroutine return
Das muss einen neuen Post Wert sein
Hab einen neuen Workaround gefunden !
Hier erstmal wieder der ASM Auszug:
Erklärung:Code:W = Getadc(33) +000000AA: 9100007C LDS R16,0x007C ADMUX +000000AC: 7E00 ANDI R16,0xE0 Bits 0-4 löschen +000000AD: 9110007B LDS R17,0x007B ADCSRB +000000AF: 6018 ORI R17,0x08 MUX5 setzen, weil KanalNr >= 32 +000000B0: 6001 ORI R16,0x01 Kanalnr. 1 !! stimmt so ! +000000B1: 9310007B STS 0x007B,R17 ADCSRB +000000B3: 9300007C STS 0x007C,R16 ADMUX +000000B5: 940E00C8 CALL 0x000000C8 GETADC aufrufen
Hab in der History zu 1.11.9.1 gefunden, das es ab jetz funktionieren soll
dabei ist mir der Fehler* aufgefallen, es wird nicht die KanalNr geprüft, sondern nur der Wert der übergeben wird, und beim M2560 wird für KanalNr > 7 ein ADMUX-Wert von 32+x gebraucht !!
Und so gehts, wenn ein Kanal 8-15 gelesen werden soll, muss man das selber abfragen/ausrechnen, und dann mit GetADC(32+x) Aufrufen, dann wird das MUX5 richtig gesetzt !
Also Wert 32 entpsricht ADC-Kanal 8.
Edit:
\/
PS:
* mit Fehler ist Anwenderfehler gemeint![]()
Danke ! War ein heiser Tipp.
Habe mir das Datenblatt nochmal angeschaut, erscheint mir jetzt auch als logisch was du da schreibst
100000 ADC8 entspricht DEZ 32
100001 ADC9
100010 ADC10
100011 ADC11
100100 ADC12
100101 ADC13
100110 ADC14
100111 ADC15 entspricht DEZ 39
Mit folgendem Bascom 1.11.9.1Code funktioniert es jetzt bei mir
man kann natürlich auch zwei getrennte Schleifen programmierenCode:$regfile = "m2560def.dat" $hwstack = 82 '80 $framesize = 68 ' 64 $swstack = 68 '44 $crystal = 16000000 'Quarzfrequenz Config Pind.5 = Output Led Alias Portd.5 $baud = 57600 'Config Com4 = 115200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0 'Open "com4:" For Binary As #4 'USB Buchse Dim Kanal As Byte Const Tz = "," ' Trennzeichen ist ein Komma ' *** ADC *** Config Adc = Single , Prescaler = Auto , Reference = Internal_1.1 Start Adc '*** Hauptschleife *** Do Print "*" ; Tz; Led = 0 For Kanal = 0 To 15 If Kanal > 7 Then Kanal = Kanal + 24 ' Wegen Bascom 1.11.9.1 Bug notwendig Print Getadc(kanal) ; Tz; If Kanal > 7 Then Kanal = Kanal - 24 ' Wegen Bascom 1.11.9.1 Bug notwendig Next Kanal Led = 1 Print "#" ; Tz Loop End
For Kanal = 0 To 7
und
For Kanal = 32 To 39 ' = 8-15
Nochmal Danke und viel Spaß weiterhin
Lesezeichen