Erste Hilfe?

Hi
Ich glaub, da machst du einen Gedankenfehler: Die Spannung eines µC mit der eigenen Versorgungsspannung überwachen, wird nicht funktionieren. Bau einen kleinen zusätzlichen Akku für die Versorgung des Controllers ein, entkopple ihn mit einer Diode, dann wird's gehen.
Überleg mal: ein Spannungsteiler 50% von 5 V VCC hat 2,5 V. Nun sinkt die Spannung auf 4 V VCC. Die 2 V am Spannungsteiler sind immer noch 50 %.
100 % VCC = binär gewandelt Bspw. 255. Da ist es egal, ob du 5, 4 oder nur 2 V Versorgungsspannung hast. Wenn dein Spannungsteiler auf 50 % eingestellt ist, wirst du immer das gleiche Ergebnis haben.
Versorgst du nun aber deinen µC über einen extra-Akku, dann kann dein Last - Akku in die Knie gehen und du merkst: aha, der Last-Akku hat nur noch 50% vom Versorgungsakku. Ich hoffe, es einigermaßen deutlich beschrieben zu haben. Vielleicht geht aber auch, eine Referenzspannung mittels einer Zener-Diode herzustellen, oder den Akku mit einer höheren Spannung auszustatten und einen Spannungsregler für die Versorgungsspannung zu opfern. Dann kannst du den Abfall deines Akkus überwachen.
Also, dein Akku hat 12 V im geladenen Zustand. Mit einem Festspannungsregler hälst du VCC des Controller auf gleichbleibendem Niveau. Die Akkuspannung führst du nun über einen Spannungsteiler 2/3 zu 1/3. So bekommst du bei 100 % 4 V an den ADC. Sinkt nun die Akkuspannung au bspw. 70% = 8,4 V, so bleibt aber die Versorgung gleich, der Spannungsteiler aber bringt auch nur 70%. Von 4 V also nur noch 2,8 V. Das wirst du auch auswerten können.
Übrigends, die Freunde vom Mikrocontroller.Net haben ein nettes Tutorial zum ADC in Assembler des Atmega 8. Vieleicht hilft's dir.
Gruß oldmax
 
Ich hoffe, es einigermaßen deutlich beschrieben zu haben.
Danke oldmax ich habe es begriffen:D

Wenn mir nun noch einer sagen könnte welche Formel die tatsächlich richtige ist,
wäre ich erstmal wieder beruhigter:eek:
 
Hallo zusammen,
Überleg mal: ein Spannungsteiler 50% von 5 V VCC hat 2,5 V. Nun sinkt die Spannung auf 4 V VCC. Die 2 V am Spannungsteiler sind immer noch 50 %.

er nutzt die interne 1,1V Referenz, nicht VCC als Referenz.


Zu dem Vergleich-Verständnis:

Code:
ldi r17, high(0x2E4)  ; entspricht ldi r17, 0x02
ldi r16, low(0x2E4)   ; entspricht ldi r16, 0xE4

Dein ADC Ergebnis ist in r19 und r18 (H, L)


Jetzt der Vergleich:

cp r16, r18   ; low bytes vergleichen
cpc r17, r19  ; high bytes vergleichen, carry berücksichtigen
brcs bal_on   ; springe, wenn ADC Wert größer als 0x2E4

Im Moment habe ich leider keine Zeit, um mir das nochmal näher anzusehen.

Dirk
 
Hi,

Überleg mal: ein Spannungsteiler 50% von 5 V VCC hat 2,5 V. Nun sinkt die Spannung auf 4 V VCC. Die 2 V am Spannungsteiler sind immer noch 50 %.
wo er recht hat, hat er recht :D Nennt man glaube ich Meßbrücke ;)
Wenn sich beide Zweige gleichmäßig ändern dann bleibt der Brückenzweig
trotzdem im Gleichgewicht :D

Also entweder man nimmt für diese Anwendung als Referenz die interne
Bandgap-Referenzquelle des Atmels oder wie Oldmax gesagt hat nen zweiten
Akku. ;)

Gruß
Dino
 
Hi
Ok, das ist etwas anderes, aber soweit hab ich das nicht durchschaut.... obwohl.... egal, so falsch hab ich aber auch nicht gelegen....:)
 
Hi Oldmax,
Hi
Ok, das ist etwas anderes, aber soweit hab ich das nicht durchschaut.... obwohl.... egal, so falsch hab ich aber auch nicht gelegen....:)
ich nehme mal an das du auch in diese Richtung gedacht hast ...
Wenn er als Referenz die Versorgungsspannung angelegt hat dann ändert sich
mit der Verstellung der Versorgungsspannung automatisch auch seine
Referenzspannung (ist ja in dem Fall die Versorgungsspannung). Das Verhältnis
bleibt also immer identisch dem Teilerverhältnis das er mit dem Spannungsteiler
der beiden externen Widerstände eingestellt hat. Wenn man sich also keinen
festen Bezugspunkt schafft, dann mißt man nur das Teilerverhältnis der beiden
Widerstände :D Nicht mehr und nicht weniger ;)

Gruß
Dino
 
Habe das jetzt mal mit den verschiedenen Spannugsquellen probiert,
leider immer noch der selbe Efekt:(
Entweder schickt mir der AD_Wandler falsche Werte,
oder irgendwas ist an dem Vergleich faul:mad:
Kann ich mir die AD-Wandlerwerte irgendwie sichtbar machen,
wie z.B wenn der Highwert ne 0x02 wäre das sie dann 2xblinkt,
oder ähnliches:confused:
 
Hallo,

stell am besten nochmal dein vollständiges Assembler-Programm in das Forum, dann schaue ich heute Abend nochmal drüber.

Dirk
 
Hier ist nochmal das Proggie:
Code:
;-------------------------------------------------------------------------
; Titel : AD-Test
;-------------------------------------------------------------------------
; Funktion :
; Schaltung :
;-------------------------------------------------------------------------
; Prozessor : ATtiny25
; Takt : 1000000 Hz
; Sprache :
; Datum : 25.2.2011
; Version : 1.0
; Autor :
; Programmer:
; Port :
;-------------------------------------------------------------------------
; created by myAVR-CodeWizard
;-------------------------------------------------------------------------
.include	"tn25def.inc"
; Prozessordefinition
.cseg
.org	0
begin:	rjmp	main	; 1 Reset
	reti		; 2
	reti		; 3
	reti		; 4
	reti		; 5
	reti		; 6
	reti		; 7
	reti		; 8
	rjmp	onadc	; 9 ADC Wandlung komplett
;------------------------------------------------------------------------
; Initialisierungen
;------------------------------------------------------------------------
main:	;	Portsinitialisieren
	sbi	ddrb,pb2
	cbi	Ddrb,pb4	; PORT3
; ADC initialisieren
	ldi	r16,(1<<MUX1)|(1<<REFS1)|(1<<ADLAR)	;ADC2 | 1.1V referenz | Links ausgerichtet
	out	ADMUX,r16
	ldi	r16,(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)
	out	ADCSRA,r16
;--- Interrups erlauben ---
	sei
;------------------------------------------------------------------------
; Hauptprogramm-Schleife
;------------------------------------------------------------------------
mainloop:	
	rcall	balance
	rjmp	mainloop	; Sprung
;--------------------------------------------------------------------
; getValueADC - liest den aktuellen Wert vom ADC ; PA: r18/r19 = Ergebnis
;--------------------------------------------------------------------
onadc:

	in	r18,adcl
	in	r19,adch	; Einlesen

	reti
;--------------------------------------------------------------------
; r19, r18=AD-Wert r17,r16=Vergleichswert aus Tabelle
;--------------------------------------------------------------------
balance:
	cli
	push	r16
	push	r17
	ldi	r17,0x02	; High VGL Wert aus Tabelle zum Vergleichen mit r19
	ldi	r16,0xe4	; Low VGL Wert aus Tabelle zum Vergleichen mit r18
	cp	r18,r16		;Vergleich LowGemessen und LowTabelle
	cpc	r19,r17		;Vergleich HighGemessen und HighTabelle
	BRcs	Bal_on
	rjmp	Bal_off
;---------------------------------------------------------------------------
bal_fertig:
	pop	r17
	pop	r16
	sei
	ret
;----------------------------------------------------------------------------
bal_on:	;Balancer	ein
	sbi	PORTB,pb2
	rjmp	bal_fertig
;----------------------------------------------------------------------------
bal_off:	;Balancer	aus
	cbi	PORTB,pb2
	rjmp	bal_fertig
;----------------------------------------------------------------------------
 
Hallo,

zu Beginn deines Programms, stellst du im PortDirectionRegister das Bit PB4 auf low, nach Reset ist es auf low, also alles auf Eingang, brauchst du also nicht machen ... ist auch nicht der Fehler.

Im Schaltplan nutzt du PB3 als Eingang. Die alternative Portpin-Funktion von PB3 ist der ADC Input Channel 3 ADC3. Im deinem Programm nutzt du allerdings ADC2. Ändere die Konfiguration der Bits MUX3..0 im Register ADMUX. Für ADC3 MUX1 und MUX0 setzen.

Dirk
 
Du hast noch das Bit ADLAR (Left Adjust) gesetzt. Du nutzt ja nun beide Result-Register L und H, auch aus deinem Vergleichswert 0x2E4 schließe ich, dass du den 10bit Wert ganz normal rechtsbündig benötigst. entferne mal (1<<ADLAR).

Noch ein Tipp: Es reicht wenn du vor dem Vergleich die Interrupts sperrst und direkt danach wieder freigibst. Wenn du erst nach mehreren Sprüngen freigibst, geht es zwar auch, aber man vergisst es leichter und das Programm wird unübersichtlicher oder schlechter wartbar.
Code:
   cli
   cp    r18,r16        ;Vergleich LowGemessen und LowTabelle
   cpc    r19,r17        ;Vergleich HighGemessen und HighTabelle
   sei
Dirk
 
entferne mal (1<<ADLAR).
Danke werde ich machen,
Verstehe ich das richtig das ich so nur einen Wert bekomme:eek:
Dann wär es ja kein wunder warum das nicht geht:banghead:

Ich danke Dir für die Gedult die Du mit mir hast:D
 
Verstehe ich das richtig das ich so nur einen Wert bekomme:eek:
Dann wär es ja kein wunder warum das nicht geht:banghead:

Nicht ganz. Left adjust nutzt man dann zum Beispiel, wenn nur 8Bit vom ADC benötigt werden, dann reicht es aus, wenn ADCH gelesen wird, die obersten beiden Bits in ADCL sind dann die beiden niederwertigsten, die benötigt man in diesem Fall nicht.
Schau einfach mal in das Datenblatt im Kapitel ADC, Register Description, ADCH ADCL. Dort wird erläutert, wie die Bits in Abhängigkeit von ADLAR in den Result-Registern angeordnet sind. Ich denke mal, dann wird dir einiges klarer :)

Ich danke Dir für die Gedult die Du mit mir hast:D

Och, so schlimm war es doch garnicht ;) Wollen wir mal hoffen, dass es nun funktioniert.

Grüße,
Dirk
 
Da war ich zu schnell beim senden:banghead:

Endlich ist es geschafft 2 Wochen voller Gehirnkrämpfe sind endlich vorbei.
Ich danke Euch für die schnelle und unproblematische Hilfe und Gedult.
Sollten wir uns mal treffen gebe ich nen Kaffee aus:tee:

Nun aber zur Auflösung;)
Erstmal der fertige Code:
Code:
;------------------------------------------------------------------------- 
; Titel : AD-Test 
;------------------------------------------------------------------------- 
; Funktion : 
; Schaltung : 
;------------------------------------------------------------------------- 
; Prozessor : ATtiny25 
; Takt : 1000000 Hz 
; Sprache : 
; Datum : 25.2.2011 
; Version : 1.0 
; Autor : 
; Programmer: 
; Port : 
;------------------------------------------------------------------------- 
; created by myAVR-CodeWizard 
;------------------------------------------------------------------------- 
.include "tn25def.inc" 
; Prozessordefinition 
.cseg 
.org 0 
begin: rjmp main ; 1 Reset 
reti ; 2 
reti ; 3 
reti ; 4 
reti ; 5 
reti ; 6 
reti ; 7 
reti ; 8 
rjmp onadc; 9 ADC Wandlung komplett 
;------------------------------------------------------------------------ 
; Initialisierungen 
;------------------------------------------------------------------------ 
main: ; Ports initialisieren 
sbi ddrb, pb1
sbi ddrb, pb2
cbi Ddrb, pb4 ; PORT3

; ADC initialisieren 
ldi r16, (1<<MUX1)|(1<<REFS1) ;ADC2 | 1.1V referenz | Links ausgerichtet 
out ADMUX, r16 
ldi r16, (1<<ADEN) |(1<<ADSC)|(1<<ADATE)|(1<<ADIE)| (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) 
out ADCSRA, r16 
 
;--- Interrups erlauben --- 
sei 
;------------------------------------------------------------------------ 
; Hauptprogramm-Schleife 
;------------------------------------------------------------------------ 
mainloop: wdr

rjmp mainloop ; Sprung 
;-------------------------------------------------------------------- 
; getValueADC - liest den aktuellen Wert vom ADC ; PA: r14 = Ergebnis 
;-------------------------------------------------------------------- 
onadc: 
in r18,adcl
in r19,adch; Einlesen 
rcall balance
rcall uspan
reti
;--------------------------------------------------------------------
;				Balancer und Unterspannungsabschaltung 
;			r19, r18=AD-Wert r17,r16=Vergleichswert aus Tabelle 
;--------------------------------------------------------------------
balance:			
	cli					; Interups ausschalten
	push	r16
	push	r17
	ldi		r17,0x02 	; High VGL Wert aus Tabelle zum Vergleichen mit r19
	ldi		r16,0xdb	; Low VGL Wert aus Tabelle zum Vergleichen mit r18
	cp		r19, r17	; Werte Vergleichen hier Highgemessen=r19 , Hightabelle= r17
	cpc		r18, r16	; Werte Vergleichen und Carry setzen hier LowGemessen=r18, LowTabelle=r16
	sei					; Interups einschalten
	BRcs	Bal_on
	rjmp	Bal_off
;---------------------------------------------------------------------------
bal_on:	
	sbi PORTB,pb2		;Balancer ein
	rjmp fertig
;----------------------------------------------------------------------------
bal_off:	 
	cbi PORTB,pb2		;Balancer aus
	rjmp fertig
;----------------------------------------------------------------------------
uspan:
	cli					; Interups ausschalten
	push	r16
	push	r17
	ldi		r17,0x02 	; High VGL Wert aus Tabelle zum Vergleichen mit r19
	ldi		r16,0x19	; Low VGL Wert aus Tabelle zum Vergleichen mit r18
	cp		r19, r17	; Werte Vergleichen hier Highgemessen=r19 , Hightabelle= r17
	cpc		r18, r16	; Werte Vergleichen und Carry setzen hier LowGemessen=r18, LowTabelle=r16
	sei					; Interups einschalten
	BRcs	uspan_on
	rjmp	uspan_off
;---------------------------------------------------------------------------
uspan_on:	
	cbi PORTB,pb1		;Unterspannungsabschaltung ein
	rjmp fertig
;----------------------------------------------------------------------------
uspan_off:	 
	sbi PORTB,pb1		;Unterspannugsabschaltung aus
	rjmp fertig
;----------------------------------------------------------------------------
fertig:
	pop		r17
	pop		r16
	ret
;----------------------------------------------------------------------------

Wie von Dirk geschrieben habe ich heute das ADLRA rausgenommen,
brachte zwar ne Veränderung war aber auch noch keine Lösung.:mad:

Dann die rcall Aufrufe aus dem mainloop ins onadc gepackt,
auch wieder eine Veränderung aber immer noch nicht der Gipfel:(

Jetzt wieder die alte Formel rein und siehe da es läuft:D
Code:
cp HighGemessen, HighTabelle
cpc LowGemesssen, LowTabelle

Aber nicht das ihr jetzt denkt das ihr ruhe vor mir habt,
das nächste Projekt steht schon in den Startlöchern:cool:
 
Hallo mcflay,

noch einmal etwas zu deinem Vergleich und zu der ISR:
(ist doch ein bisschen viel Text geworden, sorry :rolleyes:)


Vergleich:

Dein Vergleich stimmt nicht.

Beispiel:

Tabelle: 0x0219
ADC: 0x0310 ; als Beispiel, ADC Wert ist größer als Tabellenwert.

Dein Vergleich:

cp HighGemessen, HighTabelle
cpc LowGemesssen, LowTabelle

nun mit Zahlen zum besseren Verständnis, funktioniert natürlich nur mit Registern:

cp 0x03, 0x02 ; ergibt c=0 HighGemessen, HighTabelle
cpc 0x10, 0x19 ; ergibt c=1 LowGemesssen, LowTabelle
; hier ist c=1
brcs uspan_on ; obwohl ADC Wert höher als Tabellenwert?

Wie subtrahierst du zwei Dezimalzahlen voneinander? Zuerst subtrahierst du die niederwertigste Stelle, einen Übertrag nimmst du zur nächst höhreren Stelle mit. Man fängt nicht mit der höherwertigen Stelle an!

Es mag zwar bei dir zufällig gerade funktionieren, das ist aber von dem ADC Wert abhängig.

richtig wäre:
cp 0x10, 0x19; c=1 ADCL, TablelleL
cpc 0x03, 0x02; c=0 ADCH, TabelleH
; c=0 ADC Wert größer als Tabelle


ADC ISR:

Du hast nun dein komplettes Programm in dei ISR gestellt, in der Hauptschleife, deinem "Hauptprogramm" hast du ledigleich ein wdr. Es ist soweit nicht tragisch, da du keine anderen Interrupts nutzt. Solltest du dein Programm aber mal ausbauen, könnten andere Interrupts unnötig blockiert werden.

Innerhalb der ISR sperrst du Interurpts, das brauchst du nicht, die ISR wird erst abgearbeitet, zum Schluss werden mit reti die Interrupts global wieder freigegeben. Nun ist es sehr kritisch, wenn du innerhalb der ISR die Interrupts global freigibst (sei). Andere Interrupts und der ADC-Interrupt selber könnten die aktuelle ADC-ISR unterbrechen. Es ist zwar möglich sowas zu machen (so kann man sich Interruptebenen aufbauen), allerdings muss man hier genau überlegen, was wann auftreten kann. Bei dir ist es im Moment nicht so kritisch, da die ADC-ISR auf Grund der im Vergleich zur Ausführungszeit längeren Wandelzeit nicht aufgerufen wird, wenn die ISR noch abgearbeitet wird. Hört sich kompliziert an, ich weiss nicht, ob ich es ausreichend verständlich rübergebracht habe.

In der ISR sicherst du das Statusregister SREG nicht. Das ist wichtig, wenn du ausserhalb der ISR auch mal Code hast.

Nun noch eine Bemerkung:
Hast du dir schon mal überlegt, das ganze ohne ISR zu machen? Du kannst den ADC-Interrupt deaktivieren, trotzdem läuft der ADC im Freerunning mode. Deine ganzen Routinen baust du in die Hauptschleife. An den ADC Wert kommst du auch in der Hauptschleife dran, indem du zuerst ADCL und direkt danach ADCH in ein Arbeitsregister kopiertst. Du musst deine Berechnung im Hauptprogramm nicht auf den ADC synchronisieren und zeitkritisch ist die Berechnung auch nicht, es würde also funktionieren. Das Programm wäre noch einfacher.

Noch eine Vereinfachung:
Vielleicht reichen auch 8bit Auflösung, dann reicht es wenn du ADCH verwendest (ADLAR wieder setzen), dein Vergleich beschränkt sich dann ledigleich auf ein cp (compare). Der ADC Wertebereich ist dann 0..255d bzw. 0..0xFF.


Grüße,
Dirk
 
Guten Morgen Dirk,
ich werde das nachher nochmal in Ruhe lesen
und schauen wie sich das auswirkt.
Je einfacher umso besser, auch die Formel werde ich mal umstellen,
dafür mache ich aber erstmal ne Sicherheitskopie vom jetzigen Stand;)
Melde mich wieder!
 
Hallo,

dafür mache ich aber erstmal ne Sicherheitskopie vom jetzigen Stand;)
das sollte man sowieso machen ;)
Bei mir wird meißt das Datum oder ne Versionsnummer in den Dateinamen des
Codes mit reingepackt. Da kommen schon mal schnell 10-20 Versionen beim
entwickeln zusammen ;) Man hat dann immer die Möglichkeit zurückzugehen
wenn was nicht mehr funktioniert.

Gruß
Dino
 
Hallo ihr alle,
ich hab da mal wieder ein Problem.
durch weitere Tests haben wir festgestellt das im Unterspannugsbereich eine Einschaltverzögerung von 1sek nötig ist.
Ich habe das soweit zum laufen bekommen
nur leider hängt sich der Prozessor nun bei einer längeren Unterspannungszeit einfach auf
und macht garnichts mehr.
Ich denke das er sich in der Warteschleife festbeißt und nicht mehr los kommt:banghead:
Code:
;------------------------------------------------------------------------- 
; Titel : AD-Test 
;------------------------------------------------------------------------- 
; Funktion : 
; Schaltung : 
;------------------------------------------------------------------------- 
; Prozessor : ATtiny25 
; Takt : 1000000 Hz 
; Sprache : 
; Datum : 25.2.2011 
; Version : 1.43
; Autor : 
; Programmer: 
; Port : 
;------------------------------------------------------------------------- 
.include "tn25def.inc" 
; Prozessordefinition 
.cseg 
.org 0 
begin: rjmp main ; 1 Reset 
reti ; 2 
reti ; 3 
reti ; 4 
reti ; 5 
reti ; 6 
reti ; 7 
reti ; 8 
rjmp onadc; 9 ADC Wandlung komplett 
;------------------------------------------------------------------------ 
; Initialisierungen 
;------------------------------------------------------------------------ 
main: ; Ports initialisieren 
sbi ddrb, pb0
sbi ddrb, pb1
sbi ddrb, pb2
cbi Ddrb, pb4 ; PORT3

; ADC initialisieren 
ldi r16, (1<<MUX1)|(1<<REFS1) ;ADC2 | 1.1V referenz | Links ausgerichtet 
out ADMUX, r16 
ldi r16, (1<<ADEN) |(1<<ADSC)|(1<<ADATE)|(1<<ADIE)| (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) 
out ADCSRA, r16 
 
;--- Interrups erlauben --- 
sei 
;------------------------------------------------------------------------ 
; Hauptprogramm-Schleife 
;------------------------------------------------------------------------ 
mainloop: wdr

rjmp mainloop ; Sprung 
;-------------------------------------------------------------------- 
; getValueADC - liest den aktuellen Wert vom ADC ; PA: r14 = Ergebnis 
;-------------------------------------------------------------------- 
onadc:
cli
push r16
in r16,sreg		;statusregister sichern
push r16
in r18,adcl
in r19,adch; Einlesen 
rcall balance
rcall uspan
rcall uebsp
sei
pop r16
out sreg,r16	;Statusregister wiederherstellen
pop r16
reti
;--------------------------------------------------------------------
;				Balancer und Unterspannungsabschaltung 
;			r19, r18=AD-Wert r17,r16=Vergleichswert aus Tabelle 
;--------------------------------------------------------------------
balance:			
						
	push	r16
	push	r17
	ldi		r17,0x02 	; High VGL Wert aus Tabelle zum Vergleichen mit r19
	ldi		r16,0xe4	; Low VGL Wert aus Tabelle zum Vergleichen mit r18
	cp		r19, r17	; Werte Vergleichen hier Highgemessen=r19 , Hightabelle= r17
	cpc		r18, r16	; Werte Vergleichen und Carry setzen hier LowGemessen=r18, LowTabelle=r16
	BRcs	Bal_on
	rjmp	Bal_off
;---------------------------------------------------------------------------
bal_on:	
	cbi PORTB,pb2		;Balancer ein
	rjmp fertig
;----------------------------------------------------------------------------
bal_off:	 
	sbi PORTB,pb2		;Balancer aus
	rjmp fertig
;----------------------------------------------------------------------------
uspan:
	push	r16
	push	r17
	ldi		r17,0x02 	; High VGL Wert aus Tabelle zum Vergleichen mit r19
	ldi		r16,0x29	; Low VGL Wert aus Tabelle zum Vergleichen mit r18
	cp		r19, r17	; Werte Vergleichen hier Highgemessen=r19 , Hightabelle= r17
	cpc		r18, r16	; Werte Vergleichen und Carry setzen hier LowGemessen=r18, LowTabelle=r16
	BRcs	uspan_on
	rjmp	uspan_off
;---------------------------------------------------------------------------
uspan_on:	
	cbi PORTB,pb1		;Unterspannungsabschaltung ein
	rcall delay				;Warte Sekunde
	rjmp fertig
	

;----------------------------------------------------------------------------
uspan_off:	 
	sbi PORTB,pb1			;Unterspannugsabschaltung aus
	rjmp fertig

;----------------------------------------------------------------------------
uebsp:
	push	r16
	push	r17
	ldi		r17,0x02 	; High VGL Wert aus Tabelle zum Vergleichen mit r19
	ldi		r16,0xf8	; Low VGL Wert aus Tabelle zum Vergleichen mit r18
	cp		r19, r17	; Werte Vergleichen hier Highgemessen=r19 , Hightabelle= r17
	cpc		r18, r16	; Werte Vergleichen und Carry setzen hier LowGemessen=r18, LowTabelle=r16
	BRcs	uebsp_on
	rjmp	uebsp_off
;---------------------------------------------------------------------------
uebsp_on:	
	cbi PORTB,pb0		;Überspannungsabschaltung ein
	rjmp fertig
;----------------------------------------------------------------------------
uebsp_off:	 
	sbi PORTB,pb0		;Überspannugsabschaltung aus
	rjmp fertig
;----------------------------------------------------------------------------
fertig:
	pop		r17
	pop		r16
	ret
;----------------------------------------------------------------------------
; Unterprogramm Warteschleife
delay:
;--------------------------------------------------------------------
; Warte-Routine 
;--------------------------------------------------------------------

myWait_2s:
 push r20
 ldi r20,5 ; +/- 5 für 1 sekunde mehr oder weniger
myWait_2s_3:
 push r20
 ldi r20,255
myWait_2s_2:
 push r20
 ldi r20,255
myWait_2s_1:
 dec r20
 brne myWait_2s_1
 pop r20
 dec r20
 brne myWait_2s_2
 pop r20
 dec r20
 brne myWait_2s_3
 pop r20
 ret
;-------------------------------------------------------------------
Vielleicht hat ja einer ne Lösung für mich:help:
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)