E liegt über einen Widerstand an Plus,Zitat:
Sie bleibt unverändert, egal wie oft E gegen + getippt wird.
Du musst E dann 3 mal nach Masse ziehen.;)
Druckbare Version
E liegt über einen Widerstand an Plus,Zitat:
Sie bleibt unverändert, egal wie oft E gegen + getippt wird.
Du musst E dann 3 mal nach Masse ziehen.;)
Lieber Siro,
es steht doch "egal wie oft" gegen Masse gezogen ...;)
Aber dein Testaufbau hat mir geholfen!
Hab mir ein neues 1602 LDC besorgt (€ 13,-)
Und ....
BINGO !!!!!!!!!!!!
@ avr_racer,
hab daraufhin gleich dein text3-progrämmchen adaptiert (statt portD > portA).
Und alles funktioniert!
Danke euch allen!
Jetzt kann ich mal beruhigt weiter machen ... bis ich auf das nächste Problem stoße ...
Dann rühr ich mich wieder (bin mir sicher!).
Spätestens jedoch, wenn ich fertig bin - und das wird noch lange dauern .................. ;)
Schön zu hören das es funktioniert, weniger schön das ein nicht benutztes und nagelneues einfach defekt war/ist. So kann man sich eben nen Wolf suchen warum das Programm nicht funktioniert obwohl es das tut vllt auch nur in Ansätzen.... Seuftz ;)
So, bin schon wieder da ;)
Nichts tragisches ...!
@avr_racer,
ich hab mir deine Zeitenrechnung genauer angesehen und bin zur Ansicht gekommen, dass sie nicht stimmt.
Jetzt gibt es zwei Möglichkeiten:
1. sie stimmt wirklich nicht oder
2. meine Rechnung stimmt nicht!
Dein Beispiel aus text3: (cc = cpu clock cycle = 1µs)
wait25us:
ldi r20,$20 ;1cc
wait25us1:
dec r20 ;1cc
brne wait25us1 ;1/2cc
ret
Nehmen wir brne mit 1cc an (=1µs), dann ergibt das folgende Rechnung:
$20 sind dezimal 32. Also 32 Durchgänge/Schleifen.
32 mal 2 (dec + brne á 1µs) ergibt 64µs und keine 25.
Wo liegt nun der Gedanken-Fehler?
Bei mir oder bei dir?
@alle:
Übrigens stehe ich schon länger auf der Leitung und komm nicht weiter.
Ich will/muss einen ADC-Wert (8Bit ADLAR genügt) in Volt umrechnen (Akkuspannung 12V, max. 13,7 Ladeschlussspannung).
Folgende ADC-Beschaltung: 15V-68k-ADC-50kPot-GND.
Bei exakt 15V wird mit einem Spindelpoti der ADC-Maximalwert genau auf 5V eingestellt.
Somit hab ich eine Reserve, sollte die Spannung mal über 13,7V ansteigen.
Zudem dient eine 5V Z-Diode als Schutz.
Bei 15V liegen nun 5V am ADC. Das ergibt einen ADC-Wert von 255 (ADCH).
Das ist Basis für die weiteren Berechnungen.
Nehmen wir nun als zu messende Spannung 10,4V an.
Das ergibt folgende Schlussrechnung:
15V.....255
10,4V....?
10,4*255/15=177 gerundet.
Umgekehrt:
255.....15V
177......?
15/255=0,0558 Und da haperts schon! Wie rechne ich mit 0,0588?
177*0,0588=10,4
Auch hab ich nachstehende Divisions-Routine im Netz gefunden.
Allerdings rechnet die nicht richtig.
Da steht im Rest (=Nachkommastelle) bei einer Rechnung 177/17, statt 4 eine 8!
Wo liegt hier der Fehler, bzw. wie/wo kann man das berichtigen?
Ich möchte bei den Zehntel-Volt schon relativ genau sein.
Sonst schaut bisher alles gut aus ... :)
Code:; 8Bit Division mit Rest; Laufzeitverhalten im schlechtesten Fall (255/1) 103 Taktzyklen
; Achtung:
; Divison durch 0 wird nicht abgefangen und führt zu einer Endlosschleife
; Dieser Algorithmus funktioniert nur für vorzeichenlose 8Bit-Werte
; Nach Division steht das Ergebnis in r18 und der Rest in r16
.def divident = r16
.def divisor = r17
.def ergebnis = r18
.def zw = r19
ldi divident,177 ; Berechnet 177/17 !
ldi divisor,17
division:
clr ergebnis ; Ergebnis initialisieren
ldi zw,1 ; Teilbarkeit durch 1 annehmen
tst divisor
loop:
brmi div_loop ; Den Divisor linksbündig ? -> JA
lsl zw ; Zwischenergebnis und
lsl divisor ; Divisor einen Schritt nach links
rjmp loop ; ... und nochmal prüfen
div_loop:
cp divident,divisor ; divident >= divisor
brlo division_weiter ; -> nein
add ergebnis,zw ; Ergebnis vergrößern und
sub divident,divisor ; Dividenten verkleinern
division_weiter:
lsr divisor ; Divisor und Zwischenergebnis
lsr zw ; einen Schritt nach rechts
brne div_loop ; zw!=0 ? ->JA
nop ; Ergebnis in ergebnis
; Rest in divident !
end: rjmp end
Hallo HeSt,
Rest ist nicht gleich Nachkommastelle. Ich habe den Code mal durch meinen BASCOM Simulator laufen lassen und bekomme als Rest nicht 8 sondern eine 7. 177/17 ist ja gleich 10 Rest 7. Um auf die erste Nachkommastelle von 4 zu kommen, könnte man nun den Rest von 7 wieder durch 17 teilen. Um den gleichen Code zu nutzen erst den Rest von 7 mit 10 multiplizieren und dann den Code mit 70 und 17 füttern.
Gruß
Searcher
Servus Searcher,
danke für die Antwort!
Werde es dann gleich probieren ....
Eine andere Frage noch an alle:
Im Datenblatt des Mega16 steht auf Seite 32 in Tabelle 14, dass der µC von den Timern nur durch Timer 2 geweckt werden kann.
Oder lese ich das falsch!?
Im AVR-Studio funktionieren aber sehr wohl auch T0 und T1 OVF.
Kann ich davon ausgehen, dass das auch in der Realität so ist?
Anhang 33926
Es kommt drauf an, welchen Sleep Mode Du möchtest, dann kannst Du sehen, was man nutzen kann, zum Aufwecken (im Datenblatt steht es dann ja). Oder Du entscheidest Dich für eine bestimmte Art und Weise, den aufzuwecken (weil es keine andere Möglichkeit gibt), dann muss geschaut werden, welcher Sleep-Mode dazu möglich ist. Je tiefer der Schlaf, desto weniger Möglichkeiten gibt es zurück zu kehren.
Beim ATmega328P steht auch nur Timer2. Ich verwende aber Timer1, der dann bei Überlauf einen Interrupt auslöst und auch zum Aufwachen führt.
Allerdings muss ich darauf achten, dass im jeweiligen Sleep-Mode dann der Timer1 auch aktiv ist. In manchen Modi sind bestimmte Dinge abgeschaltet, dann kann man die nicht nutzen.
MfG
Bei 1Mhz
;Call = 3 Takte (3µs)
wait25us:
ldi r20,$20 ;1cc ; 1Takt (1µs)
wait25us1:
dec r20 ;1cc ; 1Takt (1µs)
brne wait25us1 ;1/2cc ; 1Takt bei 0 und 2 Takte wenn !=0 also (1µs oder 2µs)
ret ; 4Takte (4µs)
3µs + 1µs + (32*3µs(!=0) - 1µs(bei 0)) + 4µs = 103µs bei 1Mhz
Ich habs mir mal geschrieben und passe es auf die Frequenz an, ja es geht auch anders und manchmal verwirrend ;)
Ja ADLAR lässt den ADC auf 8Bit schrumpfen somit ist deine Auflösung 5V (AREF) / 256bits = 0,0195..V also 19,5mV pro Bit
Diesen Wert deklarierst du dir als z.B: 195 in der Init und MULTIPLIZIERST du dir dann mit den im ADCH zu Verfügung stehenden BITS z.B.: mit 256 = 49920.
Dein Widerstandsteilerverhältnis ist 3:1 heißt 49920*3 = 149760 den Punkt richtig setzen und du hast deine 14.976V ohne geschönt zu haben.
1. 10,4*255/15 sind verkehrt denn 8bit ADC hat 256 Stufen die 0 gehört mit dazu
richtig also 10,4*256/15 =177,493bits. Abgeschnitten sinds dann nur 177 wie es auch korrekt ist. Aufgrund das dir jetzt aber im Wandler die Nachkommastellen fehlen wirds halt ungenauer.
Nur mit der Multiplikation ist es einfacher
177bits * 195(bits/V) = 34515(V) * Teiler 3 = 103545(V) jetzt nur den Punkt im LCD richtig setzen und du hast deine 10.3545V auf dem LCD, ohne DIVISION.
Nur über FESTKOMMAARETHMETIK
Wo hast denn die Routine her ? Ähm der Rest steht nicht zufällig im DIVIDENT R16 drin mit 7 ??
177/17 = 10, ;10*17 = 170
177 -170 = R 7 ;7/ 17 schwer also 7*10 = 70
70/17 = 4 also 10,4 ;4*17 = 68 somit
70-68 = R 2 ;2/17 schwer also 2*10 = 20
20/17 = 1 also 10,41 ; 1*17 = 17
20-17 = R 3 ; 3/17 schwer also 3*10 = 30
30/17 = 1 also 10,411 usw...
NEIN das Datenblatt weiß mehr als der Simulator ausser es ist unter der Hilfe angegeben. Grundsätzlich aber das Datenblatt ausschlaggebend.
Man kann aber den Timer laufen lassen oder den Prescaler vor den SLEEP-Befehl zu setzen ist nun nicht wirklich kein Problem oder ?
Danke für die Antworten!
In diesem Fall ist nur Timer2 angegeben, egal welcher Modus.
Das gibt mir Hoffnung. Im Datenblatt des ATmega328P ist auch nur Timer2 angegeben.
Mir gings nur darum, ob mein Gedankengang richtig ist.
Ob da noch vorne und hinten ein paar µs dazu kommen, darum gings nicht.
Aber danke für die exakte Erklärung!
2 Hundertstel Volt an Genauigkeit genügen mir. Wenn die Zehntel stimmen passt es schon.
Die Multiplikationen hatte ich ja auch schon im Kopf.
NUR: ein 16Bit Register (word) fasst nur bis 65535.
Laut Datenblatt wird das Ergebnis einer Multipikation in R1-R0 geschrieben = 16Bit.
Wie aber funktioniert diese Multiplikation: 49920*3 = 149760?
Wo soll 149760 gespeichert werden?
Oder hier:
177bits * 195(bits/V) = 34515(V) * Teiler 3 = 103545(V)
Da fehlt mir noch einiges an Wissen ...
Irgendwo aus dem Netz. Woher weiß ich nicht mehr.
Der Timer2 ist glaub ich ein besonderer. Zumindest beim ATmega328P kann man den auch unabhängig takten, selbst, wenn sonst alles schläft und auch der übliche Taktgenerator abgeschaltet ist.
Das man auch Timer1 verwenden kann oder einen andern, liegt beim 328P daran, dass der auch durch so ziemlich jeden Interrupt geweckt werden kann. So löst auch der Timer1 bei Überlauf einen Interrupt aus und weckt also den µC. Auch wenn der Timer1 jetzt namentlich nicht direkt in der Tabelle steht. Auch Signalwechsel an den I/O-Ports können einen Interrupt auslösen und so zum Wecken führen. So könnte man auch eine Real Time Clock extern anschließen.
MfG