Archiv verlassen und diese Seite im Standarddesign anzeigen : atmega644 und bascom -- ADC_REFMODEL
kolisson
29.12.2006, 16:48
hallo leute,
habe jetzt mal nen mega644 anstelle des 32er ausprobiert. leidert meckert bascom bei der adc initialisierung:
Config Adc = Single , Prescaler = 128 , Reference = Internal
die reference = internal an.
beim 32er geht das. laut datenblatt sind die beiden cpus in diesem bereich identisch.
ein blick in def-dateien zeigt auch folgendes:
beim mega32 findet sich der eintrag: ADC_REFMODEL=1
beim 644 steht dort: ADC_REFMODEL=5
hat jemand ne idee dazu? einfach den eintrag ändern ??
gibts irgenwo ne beschreibung zu den def dateien?
gruss
Hallo,
der M32 hat nur 1 interne Referenzspannung (2,56V) und der M644 hat 2. (1,1V und 2,56V)
Deshalb wird Bascom beim M644 mit "internal" nicht klarkommen.
Mache es einfach "zu Fuss" ...
ADCSR = 7 'Prescaler = 128
ADMUX = 192 'Reference = 2,56V
bewirkt das gleiche wie:
Config Adc = Single , Prescaler = 128 , Reference = Internal
linux_80
29.12.2006, 18:53
Hallo,
hat mich auch interessiert, da ich auch einen 644er hab, da in der Doku nix steht, hab ich mich mal durch das Bascom gehackt, und gefunden, das es zwei weitere angaben für Reference gibt, dieses wären:
INTERNAL_1.1
und
INTERNAL_2.56
es würde da sogar noch
INTERNALEXTCAP
geben.
@linux_80
da frage ich mich, warum ist so etwas in der Bascomhilfe nicht dokumentiert ?
Zumal es ja noch einige andere interne Variablen gibt, die nirgends dokumentiert sind.
linux_80
29.12.2006, 19:47
Das ist halt so 'ne Sache mit dem Dokumentieren, da wird mal schnell was angepasst ... und schon ist die Doku nicht mehr aktuell ;-)
Ich hatte extra nochmal schnell in der OnlineHilfe bei MCS vorbeigeschaut, aber da ist auch nix neues darüber drin :-k
Dokuschreiben hat leider nicht immer die oberste Priorität :-(
kolisson
30.12.2006, 12:41
danke für die tipps. das wird helfen.. da bin ich sicher. interessanterweise ist im datenblatt von atmel (seite 245 / 21.6.2) kein wort über die zusätzliche referenz von 1,1volt nix zu lesen. an andrenen stellen ist dann schon erwähnt. nur da hatte ich offenbar nicht gesucht.
also dann
danke
kolisson
30.12.2006, 12:45
Hallo,
hat mich auch interessiert, da ich auch einen 644er hab, da in der Doku nix steht, hab ich mich mal durch das Bascom gehackt, und gefunden, das es zwei weitere angaben für Reference gibt, dieses wären:
INTERNAL_1.1
und
INTERNAL_2.56
es würde da sogar noch
INTERNALEXTCAP
geben.
wäre ja nur noch zu klären, was der INTERNALEXTCAP so bewirkt.
gruss
linux_80
30.12.2006, 13:55
So, dann hab ich nommal weitergesucht,
INTERNALEXTCAP ist für ADC_REFMODEL=2
dieses sind bis jetzt nur Tiny15L und Tiny26, und da gibts die Möglichkeit Intern mit oder ohne externen Kondensator !
Das ist bei den kleinen Gehäuseformen schon mal praktisch ein Pin mehr zur Verfügung zu haben, statt mit einem Kondensator zu verschwenden.
Ja, wenn man's weiss :-k ;-)
PS:
wenn wir schon dabei sind, für ADC_REFMODEL gibts bis jetzt 6 Möglichkeiten:
0 - Classic AVRs, AT90S... grundsätzlich extern AREF, keine option
1 - so wie man das bisher kannte mit AVCC, internal, AREF
2 - für kleine Tinys um das AREF Pin zu sparen, (A)VCC, internal (ohne), AREF, internalextcap (mit kondensator)
3 - nur Tiny13, nur (A)Vcc oder internal (1.1V)
4 - Tiny24, 25 und verwandte, (A)Vcc, AREF oder Internal (1.1V)
5 - Mega256x und M644, wie in den vorhergehenden Posts zu lesen, zwei unterschiedliche interne Spannungen.
kolisson
30.12.2006, 14:10
na super,
da hab ich doch gleich alles news aus diesem thread in eine schöne kleine txt. zusammengesetzt. damit mans dsann halt weiss.
danke für die zusammenarbeit
gruss
linux_80
14.01.2007, 01:19
Hallo,
bin heute schon länger am rumtesten an einem Tiny45, wollte mal schnell den ADC anwerfen, naja, war aber nix !
Um den Bezug zu diesem Thread zu finden,
der T45 ist beim ADC_REFMODEL mit 4 angegeben, man sollte da also verschiedene Referenzen auswählen können, das geht aber nicht, Bascom meckert bei jeder Möglichkeit, ausser man lässt es ganz weg, dann wird aber auch VCC verwendet !
Dieser Tiny hat da ein paar Besonderheiten, genauso wie der Tiny25 und der Tiny85 (gibts aber noch nicht, ist aber die gleiche Serie)
Man kann zwar die Referenz direkt in ADMUX einstellen, aber spätestens bei einem GetADC(..) wird das wieder verworfen.
Es gibt da nur die Möglichkeit, im DB nachzusehen welcher Wert die gewünschte Referenz hat, und dies dem GetAdc(.) mitzugeben, als Parameter Offset.
Um den internen Temp-Sensor auszulesen braucht man die interne Referenz von 1.1V, das wäre &H80, und ADC4, da aber der ADC4 eigentlich Kanal 15 ist, muss man das auch so angeben !
Schaut dann so aus:
$regfile = "ATtiny45.dat"
Config Adc = Single , Prescaler = Auto
' Referenz auf Internal_1.1V, damit mans nicht vergisst, braucht man aber nicht !
Admux = &H80
Start Adc
' Temperaturwert aus ADC holen, Offset auf &H80 wegen Referenz !
Adc4 = Getadc(15 , &H80)
' oder gleich
Adc4 = Getadc(&H8f)
Falls mal jemand danach sucht.
PS:
Hab wegen dem Tiny45 noch ein paar kleinere Bugs gefunden, die hab ich dann aber gleich an MCS gemeldet.
Das sind u.a. die FuseBits EF, und der Chipname wird beim 45er als Tiny25 angezeigt, ist aber nur ein optischer Fehler ;-)
Ja und wegen dem ADC gibts immerhin diesen Workaround.
hi
habe gerade das gleiche problem: den attiny25 ad-wandler unter
bascom zum laufen zu bringen.
er soll mit ref=2,56V an ADC1 einen wert einlesen.
nach deiner anleitung wäre das Getadc(1 , &H90) bzw. Getadc(&H91)
klappt aber nicht.... wo mache ich da den fehler ?????
roboterheld
28.08.2007, 17:35
was meckert ihr so , im index in der bascomhilfe einfach config adc eingeben und der himmel öffnet sich. ich weiss garnicht, was ihr da so kompliziert herumsucht.
mfg
linux_80
28.08.2007, 18:32
@roboterheld
schau mal auf das Datum, seitdem hat sich schon einiges geändert !
@hütti
ein wenig mehr Infos könnten wir noch brauchen,
zB. welche Bascom Version, denn ein paar Bugs sind schon behoben, dafür evtl. wieder andere mit dabei :-k
Aber Grundsätzlich sollte das mit Config ADC jetzt hinhauen,
hab das heute aber noch nicht überprüft.
roboterheld
28.08.2007, 20:06
wer eine gekaufte version von bascom hat, aktualisiert immer auf den neuesten stand !
wer eine raubkopie hat wird diese nicht aktualisieren können und wer die freeware-4kbyte hat , ist 2 monate im rückstand mit der info.
mfg
@roboterheld
wenn ich hier eine frage stelle, habe ich keinen bock angemacht zu werden,
von wegen ich wäre ein raubkopierer oder so.
komm mal runter!
@linux
also, meine bascom-version ist die 8.9beta, vollversion.
ich möchte mit dem ad-wandler und einem attiny die spannung eines
akku's messen und wenn die einen bestimmten wert unterschreitet,
eine LED blinken lassen. habe schon diverse projekte mit bascom
programmiert, mit einem mega8 geht der code. nur der attiny zickt.
habe das normale config und alle erdenklichen variationen schon
probiert. hier mal der code
'================================================= =====
'System-Einstellungen
'================================================= =====
'Definition für ATtiny 25
$regfile "attiny25.dat"
$crystal = 8000000
'================================================= =====
'Konfigurationen
'================================================= =====
Dim X As Word
Config Pinb.3 = Output
'Konfiguration des AD-Wandlers
Config Adc = Single , Prescaler = Auto , Reference = 6 'interne 2,56V ref
Start Adc
Wait 3
'messen
'X = Getadc(0 , &H80)
X = Getadc(1)
'0,5s warten
Waitms 500
'prüfen ob kleiner als
If X < 10 Then Goto Akku_fail
End
'************************************************* *****
' Akku Fail
'************************************************* *****
Akku_fail:
'Rote LED blinken lassen in Schleife
Led:
Portb.3 = 0
Waitms 300
Portb.3 = 1
Waitms 300
Goto Led
Return
so sollte es eigentlich gehen, wie gesagt, diese "hex-varianten" habe
ich auch getestet. der AD-eingang ist pin 7.
der AD-wandler scheint immer eine 0 auszugeben, da die LED ständig
blinkt, d.h. keine werte über 10. die eingangsspannung ist aber
hoch genug !
danke für eure hilfe ![/code]
linux_80
28.08.2007, 23:44
Ich hab nur die .8.8 am laufen,
und da gibts einen Bug in der Adresse des Registers zum starten des ADCs, deshalb funktioniert das auf den Tinys25/45/85/24/44/84 nicht, es kommt immer 0 raus, oder was grad im ADC-Register stand.
Das hab ich aber hier schon mal irgendwo gepostet :-k
Hier war das:
https://www.roboternetz.de/phpBB2/viewtopic.php?p=297035#297035
@linux
das ist ja blöd, d.h. man bekommt den wandler nicht gestartet.
könnte man das nicht unter assembler erledigen? ich bin da nicht
so bewandert drinne, hättest du einen "tip" ?
habe gerade gelesen, das man falsche register-einträge in den
dat-files editieren kann. oder könnte man den wandler durchgehend
laufen lassen und nur das register auslesen.
wie ist mir wurst, hauptsache ich kann was messen
für das gleiche projekt benötige ich noch einen timer.
gehen die, oder gibt es da auch noch stolperfallen?
ich frage, da ich mir am ad-wandler fast 6 stunden vergeblich einen
abgebrochen habe 8-[
ciao
hütti =D> =D>
ich habe gerade diesen code ( laut rn wissen ) probiert: wieder nix.
ich bin wohl zu blöde .......
'================================================= =====
'System-Einstellungen
'================================================= =====
'Definition für ATtiny 25
$regfile "attiny25.dat"
$crystal = 8000000
'================================================= =====
'Konfigurationen
'================================================= =====
Dim X As Word
Config Pinb.3 = Output
Wait 2
'CONFIG Adc = Single , Prescaler = Auto ( 64 )
LDI r24,0x06
!Out Adcsr , R24
'START ADC
SBI ADCSR,ADEN
' ADC-Kanal-Nummer & Ref.1,1V nach Register 24
LDI r24,0x81
' in den ADC-Multiplexer
!Out Admux , R24
' Aufruf der getadc-funktion
!Call L_0x00f6
' laden der Ergebnisadresse (DIM X AS WORD)
LDI XL,0x63
LDI XH,0x00
' Speichern ergebnis (R24:r25) in "X"
ST X+,r24
ST X,r25
If X < 100 Then Goto Akku_fail
End
'************************************************* *****
' Akku Fail
'************************************************* *****
Akku_fail:
'Rote LED blinken lassen in Schleife
Led:
Portb.3 = 0
Waitms 300
Portb.3 = 1
Waitms 300
Goto Led
'************************************************* *****
L_0x00f6:
SBI ADCSR,ADSC ' Starten der 1. Konversion
L_0x00f8:
SBIC ADCSR,ADSC ' Fertig ?
RJMP L_0x00F8 ' nein, Loop1
SBI ADCSR,ADSC ' Starten der 2. Konversion
L_0x00fe:
SBIC ADCSR,ADSC ' Fertig ?
RJMP L_0x00FE ' nein, Loop2
IN r24,ADCL ' Ergebnis auslesen r24:r25
IN r25,ADCH
RET ' fertig
linux_80
29.08.2007, 20:05
Das SRAM beginnt bei diesem AVR bei 0x60,
die erste Variable wird warscheinlich auch dort hingelegt, im Assemblerteil wird aber der ADC-Wert bei 0x63 abgelegt, da finden sich die beiden nicht zusammen !
Entweder die Variable fest anlegen mit "At &H63"
oder die Adresse im Assemblerteil nach 0x60 ändern.
Es gibt da aber auch die Möglichkeit, direkt die Adresse im SRAM zur Variable herauszufinden :-k
Steht auf dieser Seite:
https://www.roboternetz.de/wissen/index.php/Assembler_Einf%C3%BChrung_f%C3%BCr_Bascom-User
zB.:
lds r24, {Meinfeld}
' bzw.
STS {Meinfeld}, R24
Den Rest kannst du ja in Bascom schreiben, nur den GetAdc-aufruf mit ASM.
linux_80
29.08.2007, 21:12
Hallo,
ich hätte noch einen Workaround, den Du probieren könntest,
also,
im Bascomverzeichnis ist das Lib-Unterverzeichnis,
darin gibts eine mcs.lbx (das ist die vorkompilierte Version der ganzen Funktionen die es so gibt).
Von dieser Datei erstmal einen Sicherungskopie machen, denn wir wollen das original etwas ändern :-)
Diese Datei mit einem Texteditor öffnen, und nach Getadc suchen.
dann so ändern, und wieder speichern
[_GETADC]
_GetADC:
#IF _CHIP >30
* In R24, ADCSR
.OBJ 6C80
* Out ADCSR , R24
_GetADC_1:
* In R24, ADCSR
Dann im Project mit dem Tiny25 die ganz normalen ADC-Befehle verwenden, neu Kompilieren, und schauen ob das passt was ich erfunden habe :-)
Ich habs zwar kompiliert, und nach geschaut was draus geworden ist, aber kann es nicht am lebenden Objekt testen, da ich grad keine passende Umgebung da habe.
hi
mensch mensch, das hätte ich selbst (noch) nicht hinbekommen.
probiere ich gleich morgen früh aus!!!!
vielen vielen dank schon mal
hütti
hallöle
also, das modifizieren des files hat nix gebracht.
auch dieser code funktioniert nicht :
'================================================= =====
'System-Einstellungen
'================================================= =====
'Definition für ATtiny 25
$regfile "attiny25.dat"
$crystal = 8000000
'================================================= =====
'Konfigurationen
'================================================= =====
Dim X As Word
Config Pinb.3 = Output
'CONFIG Adc = Single , Prescaler = Auto ( 64 )
LDI r24,0x06
!Out Adcsr , R24
'START ADC
SBI ADCSR,ADEN
Wait 2
Do
' ADC-Kanal-Nummer & Ref.1,1V nach Register 24
LDI r24,0x81
' in den ADC-Multiplexer
!Out Admux , R24
' Aufruf der getadc-funktion
!Call L_0x00f6
'Ergebnis in X
STS {X} , r24
STS {X+1} , r25
'LED an oder aus
If X < 500 Then Portb.3 = 1 Else Portb.3 = 0
Loop
End
'************************************************* *****
' Subroutine ADC
L_0x00f6:
SBI ADCSR,ADSC ' Starten der 1. Konversion
L_0x00f8:
SBIC ADCSR,ADSC ' Fertig ?
RJMP L_0x00F8 ' nein, Loop1
SBI ADCSR,ADSC ' Starten der 2. Konversion
L_0x00fe:
SBIC ADCSR,ADSC ' Fertig ?
RJMP L_0x00FE ' nein, Loop2
IN r24,ADCL ' Ergebnis auslesen r24:r25
IN r25,ADCH
RET ' fertig
kann das so schwer sein einen ad-wandler zum laufen zu bringen ?
bin schon fast geneigt wieder einen mega8 zu nehmen, doch leider
ist das layout zu klein.
noch irgend eine idee ? soll ich dir einen tiny schicken ? =P~
ha, habe was aus zufall rausgefunden :
der AD-wandler geht, wenn man ihn ganz normal per bascom anspricht.
halt x = getadc(1)
wenn man dann das ergebnis auswertet, kommt der fehler!
das ansprechen eines ports funktioniert, z.b.
if x > 100 then portb.3 = 1 else Portb.3 = 0
ein sprung geht aber nicht !
egal ob goto,gosub oder call, z.b.
if x > 100 then goto akku_fail
das haut nicht hin, egal wie ich es anstelle, es wird immer stumpf
der sprung gemacht, egal was man für spannungen dem wandler gibt.
auch
if x > 100 then z = 100
if z = 100 then goto akku
führt immer einen sprung aus.
jetzt bin ich echt durcheinander ...............
boahhhh, ich habe die lösung !!!!! =D> =D> =D> =D> =D>
ist ganz simpel:
die erste messung nach anlegen der betriebsspannung ist müll !!!!
also, getadc, moment warten, nochmal getadc und ein korrekter
wert wird gemessen. alle folgenden messungen sind dann auch ok.
und es muss heissen:
Config Adc = Single , Prescaler = Auto , Reference = 6
also ref. = 2,56V
eine ref von 1,1V ( sprich reference = 2 ) geht nicht !!!!!
man(n) lernt ja nie aus ...............
liebe grüsse
hütti
nachtrag!
deine modifizierte mcs.lbx muss auch sein, die originale geht nicht.
Also, die Zeit verging, Bascom 9.1 ist auf der Platte und ich habe immer
noch Probleme mit dem AD des Tiny 25.
Ich kann ihn komplett unter Bascom ansprechen. Referenz ist 2,56V.
Jedoch kommen Werte aus dem Wandler, die nicht der Eingangsspannung
entsprechen? Z.b. statt 480 werden 520 ausgegeben.
Wenn ich das Programm auf verschiedene Tinys flashe,
werden bei gleicher Eingangsspannung je nach Tiny andere Werte
ausgegeben.
Ist das ein Bug in Bascom oder schwankt die 2,56V Referenz?
( Die müsste dann aber stark schwanken )
Wie genau ist diese Referenz? Erfahrungen?
Danke für eure Hilfe
Hütti
ohhps, kleines Update:
das Gesagte galt für Bascom 9.0
habe gerade auf 9.1 umgestellt, laut File sind dort Bugs beim AD behoben.
habe nun
Config Adc = Single , Prescaler = Auto , Reference = Internal_2.56_nocap '2,56V ref
Start Adc
eingestellt.
Nun spinnt der AD völlig, kommen viel zu kleine Werte raus ????
linux_80
14.03.2008, 00:27
Hi,
inzwischen ist bekannt, das die .9.1 wieder mehr Probleme macht als sie wohl behoben hat :-k
Gibt schon diverse Threads hier.
Wenn ich für Tiny24 und Co compiliere kommt immer ein Fehler, compiliert wurde aber doch.
Hab noch nicht alle möglichen AVR durchprobiert was Bascom so zusammenbaut.
Aja,
wegen Referenz, die schwankt schon von AVR zu AVR, steht im DB wieviel das ist, nicht allzuwenig !
Kann man evtl. messen am REF-Pin aussen, wenn man das nach aussen legt.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.