Pumpensteuerung

robin

Mitglied
20. Apr. 2009
66
0
6
Sprachen
Hallo, habe in meinem Programm ein Problem, das ich leider nicht erkenne:( Zuerst einmal stelle ich den Schaltplan und den Code ein.


'Aquarien - Pumpensteuerung

'Aktuellste Version V 2.0

'Steuerung für das Target - Projekt aqua-pu5.t3
'230V Ausgang ist mit PWM-Pumpenansteuerung ausgerüstet
'Signalisierung:Tag - Nachterkennung mit zeitlicher Laufzeitreduzierung
'Trockenlaufschutz mittels externer Elektrode, Maximal - Geschwindigkeitsregulierung über Poti
'über Poti und 3 Sensoren in Abhängigkeit des Wasserstandes in der Pumpenkammer eines Außenfilters



$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 100
$framesize = 100
$swstack = 100



'BPW42 - Tag-Nacht-Erkennung
'Pullup ausgeschaltet D.2=0 Tag, D.2=1 Nacht
Config Portd.2 = Input
Pind.2 = 0
Bpw42 Alias Pind.2

'Ic4 Ansteuerung mit PWM
Config Portb.1 = Output
Ic4_ansteuerung Alias Portb.1

'Einschaltzeit IC4
Config Portb.3 = Output
Ic4_ansteuerzeit Alias Portb.3

'LED für Trockenlauf
Config Portb.0 = Output
Led_trockenlauf Alias Portb.0

'LED für Tagbetrieb
Config Portb.2 = Output
Led_tag Alias Portb.2

'LED für Nachtbetrieb
Config Portd.7 = Output
Led_nacht Alias Portd.7

'Trockenlaufsensor
' Pullup ausgeschaltet D.3=0 Trockenlauf. D.3=1 Normalbetrieb
Config Portd.3 = Input
Pind.3 = 0
Trockenlaufsensor Alias Pind.3


'Automatikgeschwindigkeit ein - aus
Config Portd.6 = Output
Led_automatik Alias Portd.6


'höchster Geschwindigkeitswert, der mit Poti eingestellt worden ist
Config Portd.5 = Output
Led_auto_geschwindigkeit_hoch Alias Portd.5


'höchster Geschwindigkeitswert -30
Config Portb.4 = Output
Led_auto_geschwindigkeit_mittel Alias Portb.4


'höchster Geschwindigkeitswert - 60
Config Portb.5 = Output
Led_auto_geschwindigkeit_niedrig Alias Portb.5


'Taster zum Einschalten der "Automatik-Funktion" Taster=0, Automatik ein, Taster-
'druck erfolgt erneut, Automatik ausgeschaltet
Config Portc.4 = Input
Pinc.4 = 0
Taster_automatik Alias Portc.4


'Sensor für die mit Poti R15 eingestellte Geschwindigkeit (ORC2-Wert
Config Portd.4 = Input
Pind.4 = 0
Geschw_sensor_hoch Alias Pind.4


Config Portd.1 = Input
Pind.1 = 0
Geschw_sensor_mittel Alias Pind.1


Config Portd.0 = Input
Pind.0 = 0
Geschw_sensor_niedrig Alias Pind.0


'Debounce auf 50 ms festlegen
Config Debounce = 50



'A/D-Wandler wir konfiguriert
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc


'Tmer 1 wird konfiguriert
Config Timer1 = Timer , Prescale = 8
On Timer1 500ms_interrupt
Timer1 = 3036
Enable Timer1
Enable Interrupts


'PWM wird Konfiguriert
Config Timer2 = Pwm , Prescale = 1 , Compare = Clear
Enable Timer2
Timer2 = 0
Start Timer2





'Variable des PWM-Wertes wird auf 16 bit festgelegt
Dim Analogwert As Word


'Flag für OC2
Dim Flag_ic4_ansteuerung As Word
Flag_ic4_ansteuerung = 0

'Flag für Trockenlauf
Dim Flag_trockenanzeige As Word
Flag_trockenanzeige = 0

'Flag für Automatikprogramm
Dim Flag_automatik As Byte
Flag_automatik = 0

Dim Geschwindigkeit As Byte





'*********** MAINLOOP *************
Do

'Bei Tasterwechsel 1 auf Null soll Subroutine Automatic angesprungen werden
Debounce Pinc.4 , 0 , Automatik , Sub
If Pinc.4 = 0 Then
Incr Flag_automatik
End If

'PWM
'Analogwert wird in 10-bit-Länge digitalisiert, Kanal 1 wird festgelegt
'die anderen Pins des Port C sind frei verfügbar
Analogwert = Getadc(1)


'Anpassung der 10-bit des ADC auf byte-Größe des Timer 2
Analogwert = Analogwert / 4

'Höchstmöglicher Analogwert
If Analogwert > 255 Then
Analogwert = 255
Else

'Ansonsten eingestellter Wert zwischen 0 und 255
Ocr2 = Analogwert
End If



'*** Auswertung Trockenlaufsensor

If Trockenlaufsensor = 0 Then

Ic4_ansteuerung = 0
Flag_ic4_ansteuerung = 0
Flag_trockenanzeige = 0

'Anzeige Trockenlauf bereits gestartet?
If Flag_trockenanzeige = 0 Then
Incr Flag_trockenanzeige
End If
'nach xx Interrupts Blinken
If Flag_trockenanzeige >= 480 Then '4 Minuten
If Trockenlaufsensor = 1 Then
Ic4_ansteuerung = 1
Else
Ic4_ansteuerung = 0
End If
End If

End If





'*** Auswertung Lichtsensor
If Bpw42 = 0 Then

Gosub Tag

If Flag_ic4_ansteuerung = 0 Then
Incr Flag_ic4_ansteuerung
End If

Else
Gosub Nacht

'Starte Nachtmodus
If Flag_ic4_ansteuerung = 0 Then
Incr Flag_ic4_ansteuerung
End If

'IC4-Ansteuerung Auszeit (xx * 500ms)
'10 Minuten ausgeschaltet
If Flag_ic4_ansteuerung <= 1200 Then 'Auszeit = 10 Minuten 1200:2:60= 10 Minuten
Ic4_ansteuerung = 0
'Relais Anzeit (xx * 500ms)
'3 Minuten eingeschaltet
Elseif Flag_ic4_ansteuerung <= 1560 Then 'Anzeit =Auszeit + 4 Minuten = 1200+360 !!!!

Ic4_ansteuerung = 1
'
Else
Flag_ic4_ansteuerung = 0
End If

End If

'Taster wird entprellt und beim Wechsel von 1 auf 0 zur Sub Automatik gesprungen
Debounce Pinc.4 , 0 , Automatik , Sub
If Pinc.4 = 0 Then
Incr Flag_automatik
If Flag_automatik > 100 Then
Flag_automatik = 100
End If
End If


Loop

End


500ms_interrupt:
Timer1 = 3036
If Flag_trockenanzeige > 0 Then
Incr Flag_trockenanzeige
Toggle Led_trockenlauf
End If

If Flag_trockenanzeige > 0 Then
If Flag_trockenanzeige <= 480 Then
Ic4_ansteuerung = 0
Flag_ic4_ansteuerung = 0

Else
Ic4_ansteuerung = 1
Flag_trockenanzeige = 0
Led_trockenlauf = 0
End If
End If



If Flag_ic4_ansteuerung > 0 Then
Incr Flag_ic4_ansteuerung
End If



'Incr Flag_automatik
If Flag_automatik > 0 Then
Led_automatik = 1
Toggle Led_automatik
End If

If Flag_automatik = 0 Then
Led_automatik = 0
End If

Return



'Sub Tag
Tag:
If Flag_trockenanzeige > 0 Then
Ic4_ansteuerung = 0
Else
Ic4_ansteuerung = 1
End If

Led_tag = 1
Led_nacht = 0
Return




'Sub Nacht
Nacht:
Led_tag = 0
Led_nacht = 1

Return



'Sub Automatik
Automatik:


Incr Flag_automatik

If Taster_automatik = 0 Then
Flag_automatik = 1
Incr Flag_automatik
If Flag_automatik > 100 Then
Flag_automatik = 100
End If
End If





If Geschw_sensor_hoch = 1 And Geschw_sensor_mittel = 1 And Geschw_sensor_niedrig = 1 Then
Geschwindigkeit = Analogwert
Led_auto_geschwindigkeit_hoch = 1
Led_auto_geschwindigkeit_mittel = 1
Led_auto_geschwindigkeit_niedrig = 1
End If


If Geschw_sensor_hoch = 0 And Geschw_sensor_mittel = 1 And Geschw_sensor_niedrig = 1 Then
Geschwindigkeit = Analogwert - 30
Led_auto_geschwindigkeit_hoch = 0
Led_auto_geschwindigkeit_mittel = 1
Led_auto_geschwindigkeit_niedrig = 1
End If


If Geschw_sensor_hoch = 0 And Geschw_sensor_mittel = 0 And Geschw_sensor_niedrig = 1 Then
Geschwindigkeit = Analogwert - 60
Led_auto_geschwindigkeit_hoch = 0
Led_auto_geschwindigkeit_mittel = 0
Led_auto_geschwindigkeit_niedrig = 1
End If

'Abschalten der Automatik
If Taster_automatik = 0 And Flag_automatik > 1 Then
Led_automatik = 0
Led_auto_geschwindigkeit_hoch = 0
Led_auto_geschwindigkeit_mittel = 0
Led_auto_geschwindigkeit_niedrig = 0
Flag_automatik = 0
Geschw_sensor_hoch = 1
Geschw_sensor_mittel = 1
Geschw_sensor_niedrig = 1
Geschwindigkeit = Analogwert
End If


Return






Der größte Teil des Codes funktioniert sehr gut, den gekennzeichneten Bereich bekomme ich nicht gebacken. Und zwar hatte ich Folgendes vor:

Mit dem Taster Ta2, Pin 27, möchte ich eine Art Automatik ein- als auch wieder ausschalten können. Diese Automatik sollte darin bestehen , drei fest vorgegebene Pumpengeschwindigkeiten in Abhängigkeit des Wasserstandes meines Außenfilters zu steuern. Die jeweiligen Wasserstände werden über unterschiedlich lange Edelstahlelektroden erfasst, die an K8, 12, 13, 14 angeschlossen werden. K7 liefert das "Pluspotential". Die Einzelnen Geschwindigkeiten sollen über die LEDs 6, 7, 8 signalisiert werden, wobei die LED 5 den "Automaticbetrieb" blinkend darstellen soll. So sehen jedenfalls meine Wünsche aus, leider noch nicht die Realität. Hat eventuell jemand einen Tipp für mich?

Für Eure Bemühungen bedanke ich mich an dieser Stelle vorab schon einmal!

Schöne Grüße
robin
 

Anhänge

  • File0001.PDF
    246,1 KB · Aufrufe: 81
Hallo Robin!

Erst einmal muss ich sagen, dass du dir einen angenehmen Stil zum Schreiben von Programmen angewöhnt hast.
Es ist alles gut beschrieben und erklärt.

Allerdings ist es eine Menge an Code, den ich nun nicht soooo schnell durchsehen kann. ;)

Beim "Stöbern" sind mir jedoch ein paar Dinge aufgefallen....
Einmal dies:
Code:
'Trockenlaufsensor
' [B]Pullup ausgeschaltet[/B] D.3=0 Trockenlauf. D.3=1 Normalbetrieb
Config Portd.3 = [B]Input[/B]
Pind.3 = 0
Trockenlaufsensor Alias Pind.3

Durch die Angabe von "INPUT" wird der Pullup aber automatisch aktiviert.
Dies stellt aber keinen Fehler im Programmablauf dar sondern nur in deiner Beschreibung.


Code:
'Taster wird entprellt und beim Wechsel von 1 auf 0 zur Sub Automatik gesprungen
Debounce Pinc.4 , 0 , Automatik , Sub
If Pinc.4 = 0 Then
Incr Flag_automatik
If Flag_automatik > 100 Then
Flag_automatik = 100
End If
End If

Das verstehe ich momentan nicht. :hmmmm:
Mittels "DEBOUNCE" schickst du das Programm in die Sub "Automatik".... sofern der Eingang PINC.4 = 0 ist.
Das ist ja soweit auch OK, allerdings.......
Code:
Taster zum Einschalten der "Automatik-Funktion" Taster=0, Automatik ein, Taster-
'druck erfolgt erneut, Automatik ausgeschaltet
Config [B]Portc.4 = Input[/B]
Pinc.4 = 0
Taster_automatik Alias Portc.4

Müsste es nicht: "Config PINC.4 = Input" heißen?
Gleiches gilt für den "PORTD.3" bzw. "PIND.3" auch!

Ich kann mich dran erinnern, dass hierüber schon zig mal diskutiert wurde und einige sagen, es ist egal ob man bei CONFIG nun PORT oder PIN schreibt.
Ich behaupte nun einfach mal:
Ein PIN ist jedenfalls für INPUT und ein PORT für OUTPUT. ;)


Zu deinem Code hätte ich zwar noch so einige Fragen, allerdings fehlt mir dafür die Zeit. :eek:



Dann habe ich mir deinen Schaltplan auch noch mal angesehen.....
Wenn du deine Pumpe nicht nur schalten sondern auch regeln möchtest (Phasenanschnitt), dann verwendest du den falschen OPTO-Triac! :eek:
robin-moc.gif
Der MOC 304x hat eine Nulldurchgangserkennung fertig eingebaut!
Daher kannst du nicht mitten in der Halbwelle der Sinuskurve deinen Lasttriac ansteuern!
Tausche den MOC 304x gegen einen MOC302x , dann sollte es funktionieren! ;)
Kannst auch hier im Forum mal nach meinem "Norkadosendimmer" suchen.
Das Lastteil verträgt in der Beschaltung auch induktive Lasten. :)


So, nun muss ich aber auch schon wieder weiter!
Je nach verbleibender Zeit, werde ich heute Abend noch mal ein oder zwei Blicke auf den Code werden.

Grüße,
Cassio
 
Hallo robin,
dies hier funktioniert jedenfalls nicht:
'Taster zum Einschalten der "Automatik-Funktion" Taster=0, Automatik ein, Taster-
'druck erfolgt erneut, Automatik ausgeschaltet
Config Portc.4 = Input
Pinc.4 = 0
Taster_automatik Alias Portc.4

Da du einen Eingang abfragen willst, musst du
Taster_automatik Alias Pinc.4
setzen.
Ich glaube nicht, dass dies
Pinc.4 = 0
irgendeine Funktion hat. Wenn du den PullUp ausschalten willst, dann geht das durch
PortC.4 = 0
Ein PullUp ist übrigens nicht automatisch eingeschaltet, wenn der Pin als Eingang definiert wird.

HBA
 
Ein PullUp ist übrigens nicht automatisch eingeschaltet, wenn der Pin als Eingang definiert wird.

HBA

Hallo HBA!

Wie gut, dass du immer mit aufpasst. ;)

Ich verwende diese "Config-Schreibweise" selber nicht und meine mal gelesen zu haben, dass beim Zuweisen von "Config PINX.y = Input" automatisch auch der Pullup aktiviert wird.
Ist aber gut zu wissen, dass es nicht so ist!

Ich halte mich persönlich aber weiterhin an die binäre Schreibweise mit DDRX und PORTX, da sehe ich auf einen Blick was los ist. :)

Danke noch mal, für die Berichtigung!

Grüße,
Cassio
 
Hallo Cassio,

vielen Dank für Deine Hilfe! Die Erläuterung: 'Trockenlaufsensor ' Pullup ausgeschaltet D.3=0 Trockenlauf. D.3=1 Normalbetrieb Config Portd.3 = Input stammt noch aus der Zeit, als die Beschaltung des "Trockensensors" noch anders aussah. Da ich in meinen Aquarien recht weiches Wasser habe, bin ich auf Nummer sicher gegangen und habe die Schaltung geändert, dummerweise aber die Befehlserklärung nicht.

Den MOC3042 hatte ich bislang stets in Lampenschaltungen verwendet, weil er den Nulldurchgangsdetektor hat und dadurch die Wendel erheblich geschont wird. Als ich den Schaltplan zeichnete, hatte ich diesen Teil aus einer bestehenden Schaltung kopiert, um mir das Neuzeichnen zu ersparen, hatte dabei die Umbenennung vergessen. In der Schaltung steckt ein MOC3021. Damit läuft es hervorragend. Trotzdem vielen Dank für den Hinweis.

Schöne Grüße
robin
 
Hallo HBA,

auch bei Dir möchte ich mich zuerst einmal für Deine Hinweise bedanken. Jede Sprache hat seine Tücken. Was einerseits: Wo kommst Du gewesen ist, ist andererseits wohl Port und Pin.

Ich habe es mir nun auf einen Zettel geschrieben und hoffe, die Unterschiede ENDLICH verinnerlichen zu können.

Im Programm habe ich es geändert, geholfen hat es leider noch nicht. Kann es sein, dass innerhalb des Programmablaufs ein Denkfehler steckt, den ich übersehen habe? Für mich sieht es richtig aus, was aber nichts heißen soll.


Schöne Grüße
robin
 
Eine andere Frage: Weiß jemand, was bei Atmel los ist? Der mega8 kostet nun, wenn er überhaupt zu bekommen ist, weit über 3 Teuronen. Wird er nun an den Börsen gehandelt?:confused:
 
Hi @All,

jetzt noch ein Kommentar von mir...

Ein PullUp ist übrigens nicht automatisch eingeschaltet, wenn der Pin als Eingang definiert wird.

Hmmmm..... das widerspricht meinem Weltbild weil:

Im Datenblatt des ATmega8 heißt es:
If PORTxn is written logic one when the pin is configured as an input pin, the pull-up resistor is activated. To switch the pull-up resistor off, PORTxn has to be written logic zero or the pin has to be configured as an output pin.

Damit verstehe ich es so, unabhängig von BASCOm oder ASSEMBLER, sobald man das Bit für die DataDirection setzt wird auch automatisch der PullUp mit aktiviert. Wenn man das nicht möchte so muss man ihn expliziz abschalten.

So habe ich das wenigstens bisher bei allen meinen Schaltungen so gehandhabt und mir wäre bisher auch nichts anderes bekannt.


Dann ....
Eine andere Frage: Weiß jemand, was bei Atmel los ist? Der mega8 kostet nun, wenn er überhaupt zu bekommen ist, weit über 3 Teuronen. Wird er nun an den Börsen gehandelt?

Kann ich auch nicht bestätigen. Bei Reichelt kostet er aktuell 2,60 Euro. Bei Farnell a bissle mehr als 3 Euro und bei RS-Online ca. 4,50 Euro. Nun gut, wenn Du natürlich bei Conrad kaufst dann bist Du über 5 Steine.

Dann.....

Wegen Deinem Programm, hänge bitte einfach mal die aktuelle Version als Anhang an diesen Thread und dann schu ich mirs auch mal an.

Grüße,
markus



Grüße,
Markus
 
Hallo Markus,

auch Dir vielen Dank für Deine Hilfe. Als Anlage habe ich den gesamten Quellcode angehängt sowie den "Automatik"-Teil, der mir Probleme bereitet.

Schöne Grüße
robin
 

Anhänge

  • V.1.0. automatik.bas
    4,3 KB · Aufrufe: 20
  • V.2.2.bas
    7,4 KB · Aufrufe: 16
Hmmmm..... das widerspricht meinem Weltbild weil:

Im Datenblatt des ATmega8 heißt es:
If PORTxn is written logic one when the pin is configured as an input pin, the pull-up resistor is activated. To switch the pull-up resistor off, PORTxn has to be written logic zero or the pin has to be configured as an output pin.

Damit verstehe ich es so, unabhängig von BASCOm oder ASSEMBLER, sobald man das Bit für die DataDirection setzt wird auch automatisch der PullUp mit aktiviert. Wenn man das nicht möchte so muss man ihn expliziz abschalten.
Hi Marcus,
ich möchte auf keinen fall dein Weltbild zum Einsturz bringen. Aber:
In dem Auszug aus dem Datenblatt wird ja lediglich gesagt, dass ein Setzen des PORT Registers auf 1 den PullUp aktiviert. Dies kann man zurücksetzen, indem man eine 0 ins PORT Register schreibt oder den Pin als Output konfiguriert. Deine Schlussfolgerung bezieht sich dagegen auf das DDR Register. Nirgendwo wird erwähnt, dass ein Setzen des DDR Registers den PullUp einschaltet. Im Gegenteil, dort steht, dass der PullUp ausgeschaltet wird, wenn der Pin als Ausgang gesetzt wird.

So habe ich das wenigstens bisher bei allen meinen Schaltungen so gehandhabt und mir wäre bisher auch nichts anderes bekannt.
Ich habe es bisher immer so gehabt, dass man PullUps explizit einschalten muss. Mein Weltbild ist, dass die betroffenen Register (DDR und PORT) nach dem Einschalten zunächst einmal alle Bits auf 0 sind. D.h. alle Pins sind als Eingang gesetzt und die PullUps sind alle aus.
Mal schauen, wie wir aus der Nummer wieder rauskommen.

HBA
 
Dann helf ich euch mal beim "rauskommen" :D

Wenn man über DDR die Pins als Ausgang geschaltet hat dann werden die Pins
ja je nach Inhalt im Port-Register auf GND (0/Low) oder +Vcc (1/High) gesetzt.

Wenn man jetzt über das DDR die Pins als Eingang definiert dann werden bei
den Pins, bei denen noch 0 im Port-Register steht die PullUps ausgeschaltet
und bei den Pins bei denen noch ne 1 im Port-Register steht werden die PullUps
eingeschaltet. Man sollte also vor dem Umschalten der Datenrichtung darauf
achten was im Port-Register steht.

Es gibt auch ne Seite im Datenblatt über die Register-Synchronisation und bei
welchem Takt und nach wieviel Zyklen die Änderungen der Register PIN/PORT/DDR
auf die Pins übernommen werden. Wenn man schnelle Änderungen benötigt oder
Spikes an den Ausgängen vermeiden will, dann muß man eine gewisse Reihenfolge
einhalten.

Gruß
Dino
 
Zu dieser Problematik, Pin oder Port, fällt mir doch glatt noch eine dumme Anfängerfrage ein: weshalb compiliert Bascom dann beide Varianten?:confused: :confused:
 
Hallo Cassio,

hatte mir Dein Projekt "Norkadosendimmer" angesehen und muss grenzenlos applaudieren:flowers: ; super! Da hattest du auch den MOC3021 berücksichtigt. Nun, der xx42 hat einen Nullstellendetektor, der, so wie ich das Datenblatt interpretiere, nur beim "Einstieg", also bei der ersten Ansteuerung den nächsten Nulldurchgang abwartet und dann eigentlich alle PWM-Signale phasengleich durchsteuern müsste.

Ich hatte bei mir den MOC 3021 eigentlich nur deshalb gewählt, weil ich zu diesem Zeitpunkt keinen 3042 zur Verfügung hatte. Hattest Du bei Deinem Projekt mal den 3042 getestet?

Schöne Grüße
robin
 
Hi!

@HBA;
ich möchte auf keinen fall dein Weltbild zum Einsturz bringen. Aber:
In dem Auszug aus dem Datenblatt wird ja lediglich gesagt, dass ein Setzen des PORT Registers auf 1 den PullUp aktiviert. Dies kann man zurücksetzen, indem man eine 0 ins PORT Register schreibt oder den Pin als Output konfiguriert. Deine Schlussfolgerung bezieht sich dagegen auf das DDR Register. Nirgendwo wird erwähnt, dass ein Setzen des DDR Registers den PullUp einschaltet. Im Gegenteil, dort steht, dass der PullUp ausgeschaltet wird, wenn der Pin als Ausgang gesetzt wird.

... da geht es hin mein Weltbild. Muss mich über mich selbst wundern dass ich so daneben gelegen habe. Hab nochmal in meinen Referenzhandbüchern gewühlt und muss sagen, Du könntest Recht haben :eek:


Aber noch was. Hier im Shop "Mikrokontrollerpraxis" bei Dirk kostet der Mega8-16PU gerade mal 2,50 Euronen. Super Preis!


@Robin; Deinen Code schaue ich mir morgen mal an. OK?

Grüße und gute Nacht,
Ma
 
Hallo Markus,

wie ich schon vermutet hatte, scheint Pin - Port keine Rolle mehr in der Definition zu spielen. Ich hatte mal die beiden kleinen Quelltexte compiliert verglichen - kein Unterschied!


$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 100
$framesize = 100
$swstack = 100

Config Pinc.4 = Input
Pinc.4 = 0
Taster_automatik Alias Pinc.4

Do

Loop

End



$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 100
$framesize = 100
$swstack = 100

Config Portc.4 = Input
Portc.4 = 0
Taster_automatik Alias Portc.4

Do

Loop


Den snapshot dazu bekomme ich nicht hochgeladen; ist zu groß. Drucke ich morgen mal in pdf rein.

Die mega8 wurden sonst für 1,25 € bei Reichelt und über ebay aus Polen sogar für 92 Cent verkauft. Genau dieser Preisunterschied von mehr als 100% veranlasste mich mal die Frage zu stellen, was da bei ATMEL abläuft!?

Schöne Grüße
robin

End
 
Hallo Robin,

Die mega8 wurden sonst für 1,25 € bei Reichelt und über ebay aus Polen sogar für 92 Cent verkauft. Genau dieser Preisunterschied von mehr als 100% veranlasste mich mal die Frage zu stellen, was da bei ATMEL abläuft!?
(off topic)
es liegt zum großen Teil an der Allokation auf dem Halbleitermarkt, das betrifft nicht nur Atmel-Mikrocontroller sondern durchweg alle anderen Produktbereiche (Speicher, MOSFET, Relais ...) und auch alle anderen Hersteller, weltweit, das auch schon seit Monaten. Ich hatte im Forum auch schon einmal was zu dem Thema geschrieben "Aktuelle Marktsituation". Jetzt wird der eine oder andere sicherlich sagen "ach, das ist Panikmache, ich habe mir letztens zwei Atmega bei Pollin (oder Reichelt oder woanders) bestellt, die hatten die doch auf Lager, ok sind halt ein bisschen teurer". ... das könnten die letzten gewesen sein. Wir kaufen die Halbleiter nicht bei Pollin oder Reichelt ein, auch nicht in diesen Stückzahlen. Teilweise haben wir seit Anfang 2010 nicht mehr Lieferzeiten von 1 bis 2 Wochen, sondern von über 25 Wochen oder mehr (wir haben immer noch aktive Bestellungen von März :rolleyes:). Es gilt nunmal der marktwirtschaftliche Grundsatz: Nachfrage und Angebot regulieren den Preis. Nur was passiert, wenn kein Angebot mehr da ist :eek: Dem Hobbyisten wird das nicht schaden, man beschäftigt sich dann in seiner Freizeit mit was anderem. Man versetze sich aber nun einmal in die Situation eines Herstellers, dem nun ausgerechnet ein Atmega88 (Beispiel) für sein Produkt fehlt und er das Produkt nicht in die Fertigung geben kann und sein Kunde aber ganz dringend das Produkt benötigt, sofort ... und die voraussichtliche Lieferzeit (man erhält derzeit keine verbindlichen Lieferzeiten) des Mikrocontrollers beträgt mehrere Monate :(
Es gibt aber auch schöne Momente ... gerade letzte Woche, mal wieder, da wir einen bestimmten Mikrocontroller in ausreichender Stückzahl auf Lager haben, Kunde: "Danke, Sie haben mir den A.... gerettet" (Sorry für die Ausdrucksweise, es war ein Zitat ;))
So ... ist jetzt ein bisschen länger geworden :D

Grüße,
Dirk
 
Hi,

noch ein wenig "OffTopic" ...
das betrifft nicht nur Atmel-Mikrocontroller sondern durchweg alle anderen Produktbereiche (Speicher, MOSFET, Relais ...) und auch alle anderen Hersteller, weltweit, das auch schon seit Monaten.
kann ihc bestätigen. Der DS18S20 ist auch ne Ecke teurer geworden. Manche
Bauteile (TSOP1636 für IR-Remote) find ich garnicht mehr, usw ...
Das Sortiment hat sich bei manchen Händlern arg gewandelt. Von den DS18S20
hab ich mir erst mal nen kleines Depot (5Stk) angelegt. Für mehr waren mir die
Dinger einfach zu teuer geworden.
"OffTopic" Ende

Gruß
Dino
 
Ich hatte mal die beiden kleinen Quelltexte compiliert verglichen - kein Unterschied!
Dies möchte ich so nicht unwidersprochen stehen lassen. Es spielt eine Rolle und einen Unterschied im Compilat gibt es schon. Einmal sprichst du das Register &H13 (PinC) an, das andere Mal &H15 (PortC). Die Auswirkungen des Unterschieds kannst du in den kleinen Programmen aber nicht sehen.

Config Pinc.4 = Input ’laut Hilfe die „richtige“ Art, einen einzelnen Pin zu konfigurieren
Pinc.4 = 0 ’hat meiner Meinung nach überhaupt keine Funktion
Taster_automatik Alias Pinc.4 ’die richtige Art einen Alias für einen Eingangspin zu setzen


Config Portc.4 = Input ’funktioniert auch, ist z.Zt. tatsächlich gleichwertig
Portc.4 = 0 ’schaltet für einen Eingangspin den PullUp aus
Taster_automatik Alias Portc.4 ’die falsche Art für einen Eingangspin, die richtige für einen Ausgang

Die Abfrage
If Taster_automatik = 1 Then
wird in der unteren Variante nicht funktionieren.

HBA
 
Einmal sprichst du das Register &H13 (PinC) an, das andere Mal &H15 (PortC).
...
...
Pinc.4 = 0 ’hat meiner Meinung nach überhaupt keine Funktion
...
...
Portc.4 = 0 ’schaltet für einen Eingangspin den PullUp aus
für den Fall das BASCOM eventuelle Fehldefinitionen gradebiegt hat man nachher
das Problem das Anfänger nicht mehr wissen woran sie sind. So nach dem Motto
"Es funktioniert aber auch anders" - das mag wohl sein. Es ist aber trotzdem
falsch.
Wenn man einen Anfänger nicht gleich die richtige Definition von PINx/PORTx
beibringt wird er über kurz oder lang mächtig gegen die Wand rennen. Leider.

Gruß
Dino
 
Hallo Robin, jetzt ist mir HBA zuvor gekommen, ich muss aber auch noch meinen Senf dazu geben, warum das so ist...

wie ich schon vermutet hatte, scheint Pin - Port keine Rolle mehr in der Definition zu spielen. Ich hatte mal die beiden kleinen Quelltexte compiliert verglichen - kein Unterschied!

Oh jeeeee, fataler Fehler und falsche Annahme:

1. Jeder PIN eines IO-Ports bis auf wenige Ausnahme kann über das DDR (data direction register) auf Ausgang oder Eingang geschaltet werden.
2. Mittels PORT (data register) (hier nicht BASCOM) werden digitale Informationen Ausgegeben.
3. Mittels PIN (port input pins) werden digitale Daten von den Eingängen gelesen.

Hast Du den den PIN als Ausgang definiert dann werden über PORT die Daten auch wirklich ausgegeben. Hast Du den PIN als Eingang definiert so schaltest Du mit Ausgabe auf Port den PullUp ein und aus.

Schau Dir hierzu einfach mal das Datenblatt Deines Megas an.

Zusammengefasst:
DDRx = 0 und PORTx = 0 dann Funktion Eingang, kein PullUp, Eingang ist hochohmig
DDRx = 0 und PORTx = 1 dann Funktion Eingang, MIT PullUp, Eingang liefert Strom wenn nach LO gezogen
DDRx = 1 und PORTx = 0 dann Funktion Ausgang, kein PullUp, aktiver Ausgang Low
DDRx = 1 und PORTx = 1 dann Funktion Ausgang, kein PullUp, aktiver Ausgang High

Sooooo.... und nun zurück zu BASCOM

Folgende Regeln

Mit Config Porta = Input schaltest Du einen gesamten Port auf Eingang ohne PullUp
Mit Config Portb = Output schaltest Du einen gesamten Port auf Ausgang

Mit Config Pina.0 = Input schaltest Du nur Bit 0 des Port A auf Eingang ohne PullUp
Mit Config Pinb.0 = Input schaltest Du nur Bit 0 des Port B auf Ausgang

Config Porta = Input und Porta = &HFF schaltet den kompletten Porta auf Input und aktiviert die PullUps

Soooo..... und nun wird kniffelig

Schauen wir uns das mal am ATmega8 an und dem Port B:

Beim ATmega8 liegen die relevanten PortB auf PINB = Adresse 16, DDRB auf Adresse 17 und PORTB auf Adresse 18.
Wenn Du Dir das in der zugehörigen Datei "m8def.dat" für den Mega8 mal ansiehst von BASCOM anschaust dann siehst Du das schwarz auf weiß:
PORTB =$18
DDRB =$17
PINB =$16

Und wieder zurück zu BASCOM......

Bei Config PORTx oder Config PINx.y schreibt BASCOM direkt in das DDRx.
Daten werden mit PORTx bzw PORTx.y gelesen und mit PINx bzw. PINx.y gelesen.

Soooo ..... nun lasse ich Dich zunächst mit Deinem Schicksal alleine. Überlege Dir nochmals Deine Aussage bzgl. der PORT und PIN Konfiguration und dann schau Dir mal in Ruhe an, was Du in Deinem Programm so getrieben hast.

Mir ist nicht bekannt, dass BASCOM einen Mechanismus für Glaskigel und schwarze Katze implementiert hat und errät, was der Benutzer von BASCOM.

Mach Dir doch mal die Gaudi und lade den Assembler-Code Deiner beiden kleinen Verdreherprogramme in AVR-Studio und schaue sie Dir in Assembler an.

Schon mal vorab ..... es ist defintiv nicht egal wie Du es definierst!

Soooo und nun schaue ich mir Dein Programm Automatik mal in Ruhe durch und gebe Dir spätestens Morgen mein Feedback. A bissle was habe ich schon gefunden.

Grüße,
Markus
 

Ü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)