Bascom RC-Empfängers an PCINT1/2 bei ATMEGA88

therealosram

Neues Mitglied
14. Aug. 2013
6
0
0
Sprachen
  1. BascomAVR
Hallo Forum,

bin neu hier. Ich habe schon Grundkenntnisse mit ATTNY13 und ATMEGA88. Und ich programmiere in BASCOM, da es dem Visual Basic von Microsoft sehr ähnelt und ich mich damit beruflich arbeite. Zu meinem Problem habe ich schon diverse Foren durchstöbert, bin aber nicht fündig nach einer Lösung geworden. Deshalb hier meine Frage:

Ich arbeite an einem Projekt mit einem ATMEGA88. Dieser soll zwei RC-Kanäle an PCINT1 und PCINT2 auslesen. Die INT0/1 will und kann ich nicht nutzen, da ich Pin5(PD.3,INT1) und Pin4(PD.2, INT0) schon für andere Dinge nutze und ich das Leiterplattendesign schon fertig habe. Im Datenblatt habe ich einiges über Register gelesen, die ich aktivieren muss. Der Compiler meckert nicht, scheint also alles richtig zu sein. Wenn ich aber das Oszi an Pin15 (PCINT1) halte bekomme ich digitale Signale mit einem Pegel von 5V heraus. Einlesen von Signalen und Auslösen einer Interrupt-Routine, geschweige denn das Messen der Impulslänge von 1-2ms klappt nicht. Was mache ich falsch?

Code:

Code:
'Autosteuerung
$regfile = "m88def.dat"
$crystal = 16000000
$hwstack = 40
$swstack = 40
$framesize = 40
$prog &HFF , &HFF , &HDF , &HF9                   ' generated. Take care that the chip supports all fuse bytes.

Dim I As Integer
On Timer1 Fehler

Config Portc.3 = Output
Config Pinb.1 = Input

Sreg.7 = 1                                        'Globale Interrupts einschalten
Pcicr.0 = 1                                       'PCInterrupt einschalten
Pcifr.0 = 1
Pcmsk0 = &B00000010                               'Einschalten  pcint1
Pinb.1 = 0

On Pcint1 Lesen

Config Timer1 = Counter , Prescale = 1 , Compare A = Toggle , Clear Timer = 1
Enable Timer1
Enable Interrupts

'Display Einrichten
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portd.7 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portb.4 , Rs = Portb.5
Config Lcd = 16 * 2
Cursor Off
Cls

Upperline : Lcd "  Los geht:"


'Load Timer1 , 32000

Do
 Lowerline : Lcd "  Puls: " ; I ; " ms   "
 Toggle Portc.3
Loop


Lesen:
  If Pinb.1 = 1 Then
   Pulsein I , Pinb , 1 , 1
  End If
Return

Fehler:
 Timer1 = 0
Return
end
 
Hallo,

bin neu hier. Ich habe schon Grundkenntnisse mit ATTNY13 und ATMEGA88. Und ich programmiere in BASCOM, da es dem Visual Basic von Microsoft sehr ähnelt und ich mich damit beruflich arbeite.
denn mal herzlich willkommen im Forum :flowers:

Ich arbeite an einem Projekt mit einem ATMEGA88. Dieser soll zwei RC-Kanäle an PCINT1 und PCINT2 auslesen. Die INT0/1 will und kann ich nicht nutzen, da ich Pin5(PD.3,INT1) und Pin4(PD.2, INT0) schon für andere Dinge nutze und ich das Leiterplattendesign schon fertig habe. Im Datenblatt habe ich einiges über Register gelesen, die ich aktivieren muss. Der Compiler meckert nicht, scheint also alles richtig zu sein. Wenn ich aber das Oszi an Pin15 (PCINT1) halte bekomme ich digitale Signale mit einem Pegel von 5V heraus. Einlesen von Signalen und Auslösen einer Interrupt-Routine, geschweige denn das Messen der Impulslänge von 1-2ms klappt nicht. Was mache ich falsch?
Hmmm ... Was du falsch machst hab ich jetzt noch nicht bis ins kleinste ergründet ;)

Also PortB.1 scheint ja schonmal auf Eingang geschaltet (laut dem Code). Wobei ich das immer direkt im Register mache und nicht mit diesen Befehlen von Bascom. Ist aber ne andere Geschichte.

Das was du an +5V an diesem Pin mißt, kommt vom eingeschalteten internen PullUp (wegen Input-Befehl). Mißt du denn auch mal 0V mit dem Oszi oder bleibt der Pin auf +5V?

Diese Zeile mit ...
$prog &HFF , &HFF , &HDF , &HF9
... für die Fuses würde ich entfernen oder auskommentieren. Ist zu gefährlich das da mal Mist passiert. Das stellt man einmal direkt selber per Hand ein und dann ist gut.

Warum machst du ...
Pinb.1 = 0 :confused:
Das ist Blödsinn.

Außerdem scheinst du einen Denkfehler im Programm zu haben ...
Pulsein I , Pinb , 1 , 1
... dieser Befehl.
PULSEIN var , PINX , PIN , STATE
State: 1 means sample 1 to 0 transition.

So wie ich es verstehe mißt dieser Befehl die Zeit zwischen zwei Flanken. Er wartet also darauf das der Pegel auf 1 geht und mißt dann die Zeit bis der Pegel wieder auf 0 geht. Durch deinen PCINT hast du dem Befehl aber bereits die steigende Flanke geklaut. Er wartet also bis zum nächsten 0-1 Wechsel. Außerdem sollte man keine Befehle in eine ISR (InterruptServiceRoutine) packen die auf irgendwas warten weil sich die Interrupts sonst selber überholen.

Also da mußt du dir nochmal ein paar Gedanken machen. Ich fürchte mal das da zwei Methoden kollidieren (PCINT und PULSEIN).

Code:

Code:
'Autosteuerung
$regfile = "m88def.dat"
$crystal = 16000000
$hwstack = 40
$swstack = 40
$framesize = 40
$prog &HFF , &HFF , &HDF , &HF9                   ' generated. Take care that the chip supports all fuse bytes.

Dim I As Integer
On Timer1 Fehler

Config Portc.3 = Output
Config Pinb.1 = Input

Sreg.7 = 1                                        'Globale Interrupts einschalten
Pcicr.0 = 1                                       'PCInterrupt einschalten
Pcifr.0 = 1
Pcmsk0 = &B00000010                               'Einschalten  pcint1
Pinb.1 = 0

On Pcint1 Lesen

Config Timer1 = Counter , Prescale = 1 , Compare A = Toggle , Clear Timer = 1
Enable Timer1
Enable Interrupts

'Display Einrichten
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portd.7 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portb.4 , Rs = Portb.5
Config Lcd = 16 * 2
Cursor Off
Cls

Upperline : Lcd "  Los geht:"


'Load Timer1 , 32000

Do
 Lowerline : Lcd "  Puls: " ; I ; " ms   "
 Toggle Portc.3
Loop


Lesen:
  If Pinb.1 = 1 Then
   Pulsein I , Pinb , 1 , 1
  End If
Return

Fehler:
 Timer1 = 0
Return
end

Gruß
Dino
 
Vielen Dank für die schnelle Antwort,

der Code stellt natürlich nur den Versuch dar, das Signal so an den Pins zu erfassen, dass diese zum Auslösen einer ISR führen, da das Signal eines RC-Empfängers etwa 50 Hz hat. Der restliche Code mit Berechnungen läuft natürlich wesentlich schneller. Den kompletten Code für den ATMEGA hab ich schon für die Messung an Potis (Joystick) fertig.

Mißt du denn auch mal 0V mit dem Oszi oder bleibt der Pin auf +5V
Aus dem Ausgang kommt ein wechselnder high/low-Pegel +5/0V den ich aber mit dem Oszi nicht triggern kann. Sieht aus wie ein digitales Signal.
Die Fuses nehme ich raus.

Laut meinem Buch (BASCOM BASIC, Ulli Sommer) ist das eine Möglichkeit, den Pegel des Eingangs auf 0v zu ziehen (Pull Down). Das geht bestimmt einfacher.
Hat aber bisher immer super funktioniert.

Pulsein I , Pinb , 1 , 1
Die Funktion dieses Befehles ist mir bekannt. Bei ..., 1 oder ..., 0 wird entweder die Zeit des High oder Low-Pegel gemessen. Das funktioniert im normalen Programmablauf auch gut, so dass mit diesem Wert nach weiteren Umrechnungen auch Ausgaben (PWM) steuern kann.

... fürchte mal das da zwei Methoden kollidieren (PCINT und PULSEIN)
Vielleicht gibt es da auch andere Wege die Zeit der High-Flanke in einer ISR zu messen. Mein Display zeigt den Wert 0 an, obwohl das Programm läuft. Natürlich hält die Ausgabe der Variable auf das Display das Programm auf. Aber um mit dem System vertraut zu werden, hab ich das drangelassen um den Wert zu ermitteln.

ich bin mir auch nicht sicher, ob das
Sreg.7 = 1
Pcicr.0 = 1
Pcifr.0 = 1
Pcmsk0 = &B00000010
so richtig ist. Im Datenblatt findet man immer nur Assembler oder C - Beispiele und diese direkten Befehle sind Neuland für mich. Es scheint, als ob die ISR-Routine gar nicht gestartet wird.

Wäre nett, wenn Ihr mal ein Beispiel posten würdet, wie man mit den PCINT1/2 eine ISR-Routine aufruft und die Interrupts richtig einstellt.
Auch ist mir die Funktion des Preload des Timers nicht klar. Ich weiß, dass die Frequenz und der Prescale Einfluss auf die Dauer bis zum Erreichen des Überlaufs des Timers hat. Aber wofür brauch ich dann den Preload? Bin gerne bereit was Neues zu lernen.
 
-Zu Pinb.1=0:
PINB (Port B Input Pin Adress Register B)ist ein I/O-Register, in dem der IST-Zustand der Beinchen von PortB ausgelesen werden kann. Schreibt man eine 0 in ein Bit dieses Registers, hat das keinen Effekt. Schreibt man eine 1, wird das korrespondierende Bit im Port-Register getoggelt, und somit der Zustand des Beinchens (je nach dem gerade aktiven Zustandes des Datenrichtungsregister-Bits).
Der Controller besitzt keinen Pulldown (Widerstand).
Über das Datenrichtungsregister-bit kannst Du den Ausgangstreiber eines Beins ein-/ausschalten.
Ist der Treiber aktiv, legt das Portregister-bit den Pegel (über den Treiber) fest.
Ist der Treiber inaktiv, wechselt das Portregister-Bit zwischen Tristate und dem Pullupwiderstand. Die andere Seite des Widerstandes liegt liegt (oh welch Überraschung) auf Vcc, dazwischen liegt jedoch ein FET oder ähnliches der (durch das PUD (Pullup disable)-Bit im I/O-Register MCUCR) Die Pullups aller Beinchen unabhängig von DDR und PORT-Registern abschalten kann. Siehe dazu das Datenblatt ab S 71 (Kapitel 14 I/O-Ports).

SREG.7=1: setzt das I-Flag im Statusregister, und erlaubt Interrupts global. das geht so, klar. Allerdings etwas unüblich, und eventuell unübersichtlich. Selbst unter Assembler gibts dafür 'nen eigenen Befehl: SEI (Set Global Interrupt Flag). Bei Bascom "enable interrupts".

(da SREG immer die I/O-Adresse 0x3F hat, und somit nicht "direct bit accessible" ist, führt Dein Code zu:
-SREG in ein Rechenregister kopieren (in Rxx, SREG '1Taktzyklus, 1word im Flash)
-Rechenregister mit Bitmaske (&b10000000) verANDen (andi Rxx, 0b10000000 '1Takt, 1word)
-Rechenregister nach SREG zurückschreiben (out SREG, Rxx '1Takt, 1word)

Sei belegt 1word Flash, und benötigt einen Taktzyklus.

Zu den 3 Pin Change Interrupt Registern: Das Control- und das Flagregister beschreibst Du mit einer Read-Modify-Write- Instruktion (wie eben beim SREG erklärt: I/O-Register in Rechenregister kopieren, dort gezielt 1 Bit setzen oder löschen, das Ergebnis zurück ins I/O-Register kopieren (wo es wirksam wird)). Die anderen Bits dieser Register bleiben unverändert.
Beim Maskenregister legst Du alle Bits direkt fest (Maske in Rechenregister laden, und ins I/O-Register kopieren.

Allerdings ist hier, wie auch beim SREG zu sagen: Du programmierst mit Bascom in einer Hochsprache. Da gibts entsprechende Hochspracheninstruktionen für. Sicher geht der Code so, man kann ja auch alles als eingebetteten Assembler schreiben... es ist nur irgendwie inkonsequent.
Andererseits ist es (insbesondere für ursprüngliche Assembler-Programmierer) einfacher, direkt die Register zu manipulieren. Da wissen sie nämlich, was geschieht. Was so'n init oder config-Befehl jetzt auf 'nem konkreten Controller bewirkt, kann man Bascom und der Hilfe nämlich nicht immer entnehmen.
Abgesehen davon decken diese Configs nicht immer alle Möglichkeiten eines konkreten Controllers ab (logisch). Und da kommt man eben auch in Bascom mit dem Zugriff auf die I/O-Register weiter.
Quintessenz: Immer auch das Controllerdatenblatt hinzuziehen.

Man kann auch in VisualBasic oder so Programme schreiben, die auf Kapselung, Prozeduren usw verzichten, und trotzdem laufen.

Edit: beim Timer gehts schon los. Timer1 bietet 16 verschiedene Waveform Generation Modes - ich sehe da bei der Bascom-Config nicht wirklich durch... egal
Was meinst Du mit Preload (bezüglich Deines Quelltextes - oder hast Du das gar nicht drin?)?
Ich vermute, Du spielst hierrauf an:
Aus der Frequenz der Taktquelle und dem Timerprescaler leitet sich die Taktfrequenz (Schrittfrequenz) des Timers ab, soweit klar.
Der Wert, bis zu dem der Timer zählt, legt nun die Überlauffrequenz fest. Da der Prescaler nur einige diskrete Werte annehmen kann, sind beliebige Überlauffrequenzen so nicht erreichbar.
Timer1 ist höchstens ein 16bit-Timer; er kann aber auch auf 8, 9 oder 10 bit gestellt werden.
Wenn das nicht reicht, kann man nach einem Überlauf (im Interrupt) das Zählerregister manipulieren (mit einem Preloadwert beladen), und somit eine definierte Anzahl Schritte überspringen, klar?
Dein Timer kann das allerdings auch ohne Interrupt selbständig, in hardware - Du kannst eine beliebige 16bit-Zahl als automatischen Überlaufpunkt vorgeben. Allerdings wird dafür entweder das OutputCompareRegisterA, oder das InputCaptureRegister des Timers verwendet - folglich sind diese beiden als solche nicht mehr verwendbar.

Zu Deinem Problem: wofür verwendest Du denn die 3 Timer? Ggf kann man da noch'ne Zeitbasis abzweigen, und den Zeitverbrauch zwischen den (per PC-Interrupt erkannten) Flanken zu ermitteln.
 
Hallo therealosram,
du hast auch noch einen Typo drin oder dich von den Bezeichnungen verwirren lassen.
Du muss den PCInt0 freigeben, damit der PinB.1 einen Interrupt auslösen kann.
On PCInt0 Lesen

Grüße

Rolf
 
... wofür verwendest Du denn die 3 Timer? ..

Timer 0 und 2 (8-bit) werden mit ihren beiden Ausgängen jeweils für eine H-Brücke verwendet. Ich will zwei Motoren mit 24V/250W unabhängig voneinander steuern. Deshalb hätte ich den 16-Bit Timer gern für das Auslesen eines RC-Empfängers. Die Platine und Regelung ist fertig und funktioniert, wenn die beiden Kanäle mittels ADC and Potis ausgelesen werden.

Du muss den PCInt0 freigeben, damit der PinB.1 einen Interrupt auslösen kann. On PCInt0 Lesen
PCINT1 ist aber laut Datenblatt ATMEGA88 der Pin15. PCINT0 = Pin14

IMG_20130815_0002.jpg
Vielleicht sollte ich dem Buch nicht mehr trauen. Ich will einfach nur verstehen, wie das Programm bei einem High-Pegel an Pin 15 (PB.1, PCINT1) jederzeit in eine Sub-Routine abbiegt, die Länge des High-Pegel z.B. in ms misst und dieser Wert in der Hauptroutine verwendet werden kann. Und zwar ohne, dass ich in der Hauptroutine massiv an Geschwindigkeit verliere. Die "hohe Schule" wäre, wenn mir einer von den BASCOM-Profis hier den Code rudimentär so anpassen würde, dass er genau das macht. Dafür wär ich echt dankbar.

...mit Bascom in einer Hochsprache. Da gibts entsprechende Hochspracheninstruktionen für. Sicher geht der Code so, man kann ja auch alles als eingebetteten Assembler schreiben... es ist nur irgendwie inkonsequent....
Ich bin mit dem Mischen auch nicht glücklich und würde dem Controller gern mit "richtigen" Befehlen sagen, was er machen soll.
Kann mir jemand ein Buch empfehlen, das diese Themen ausführlich in Bascom behandelt?
 
Hallo therealosram,
in der kopierten Seite steht aber nirgendwo, dass du einen PullDown damit einschalten kannst.
Außerdem wird nirgendwo das Pin Register gesetzt, sondern nur abgefragt.
Und das Setzen des Port Registers war vielleicht im Zusammenhang mit einem Ausgangspin. Das kann man auf der gezeigten Seite nicht sehen.

Leider hat es den Machern von Bascom gefallen, bei den PinChange für einige Verwirrung zu sorgen.
Wenn du mal in das Datenblatt des Controllers schaust, dann siehst du, dass die Pins mit PCI als PCInt0 ... PCInt23 durchnummeriert sind. Zu den PCInt0...7 gehört der PCI0 und PCMSK0, zu PCInt8...15 gehören PCI1 und PCMSK1 und zu PCInt16...23 schließlich PCI2 und PCMSK2. Alle Bezeichnungen sind eindeutig.
Anders in Bascom. Die Interrupts PCI0, PCI1 und PCI2 heißen dort PCInt0, PCInt1 und PCInt2. Also genau so, wie die unteren Pins heißen. Deswegen kommt es immer wieder zu Verwirrung.

Grüße

Rolf
 
..Die Interrupts PCI0, PCI1 und PCI2 heißen dort PCInt0, PCInt1 und PCInt2....
Ich versteh nich, was Du damit sagen willst. Den Pin15 muss ich dann doch mit PCINT1 ansprechen, oder?

Das mit PCMSK0 habe ich auch so im Datenblatt verstanden und meiner Meinung nach mit den Pcicr.0 = 1, Pcifr.0 = 1 und Pcmsk0 = &B00000010 umgesetzt.
 
Vergiß das mit Deinen Pinnumern mal lieber. Wenn Du ins Datenblatt auf Seite 2 schaust siehst Du , daß zB in der TQFP-Gehäuseform Pin15=B3=PCINT3 ist (und Pin14=B2=PCINT2).

Eindeutiger ist es, sie bei ihrem Namen zu nennen. Welche PCINTs willst Du jetzt aktivieren?
PCINT0=B0
PCINT1=B1 ?
Dann schlag im Datenblatt nach (Kapitel 13 "externe interrupts" Nummer 2 "Register Description" Punkt 8 "PCMSK0" - bei mir Seite 70).
Dort siehst Du, daß für PCINT0 und 1 PCMSK0 zuständig ist. (soweit richtig)
Wenn Du jetzt zurückblätterst zu 13.2.4 "PCICR" siehst Du daß da das Bit PCIE0 (Bit0) für PCMSK0 zuständig ist (also für alle Pins, die dort maskiert werden können). Also der PinChangeInterrupt0 freigegeben werden muß.
13.2.5 "PCIFR" enthält mit PCIF0 (Bit0) das dazugehörige Interrupt Flag welches Du sicherheitshalber durch schreiben einer 1(!) löschst.

soweit ist alles richtig, tritt jetzt (wenn die Interrupts global auch scharf sind) ein entsprechender Pegelwechsel auf, wird der Interrupt eingeleitet
(Der laufende Maschinencodebefehl wird beendet, der Interrupts werden global abgeschaltet, der Programmzähler landet auf dem Stack, und es wird die fest eingestellte Adresse im Flash angesprungen. Für den PinChangeInterrupt0 ist das (12.3 "Interrupt Vectors [...] ATmega88", Table 12-2 Seite 58) Flash Adresse 0x003. Interessiert Dich aber eigentlich nicht - die Source reicht Dir -> "PCINT0". In der eingebundenen Prozessordefinitionsdatei (regfile) steht nämlich, welche Adresse sich dahinter (bei diesem Controller) verbirgt. Es ist eine Compilervariable. An dieser Adresse ist also der Sprung in die eigentliche ISR zu schreiben. Bascom nimmt Dir das weitgehend ab, mit "On Pcint0 lesen" sagst Du Bascom, daß an der Adresse von PCINT0 (findet es im Regfile) ein Sprung an die Adresse "lesen" eingetragen werden soll. (Außerdem weiß Bascom jetzt, daß die Prozedur "lesen" als ISR mit einem Reti statt eines Ret beendet werden soll, und daß ein wesentlicher Teil der Rechenregister gesichert und wiederhergestellt werden soll).

Die etwas wiedersprüchliche Bezeichnung findet sich bereits im Datenblatt des Controllers
Das Bit PCINT0 ist Bit 0 in PCMSK0. hinter PCINT0 verbirgt sich also einfach eine 0 (die im Regfile definiert wird). Das hat aber nichts mit der in Tabelle 12-2 angegebenen Source zu tun (wo eben dummerweise auch PCINT0 steht). In der (originalen ASM) Prozessordefinitionsdatei (aus der sich die von Bascom ableitet) wird die Flash-Adresse des PinchangeInterruptes0 (also der für die Pins PCINT0 bis PCINT7 zuständig ist) mit der Variable "PCI0addr" festgelegt.
Wie das im Bascom Regfile umgangen wird (Bit PCINT0=0 vs Adresse PCINT0=0x003) ist mir da nicht ganz klar. eigentlich sollte Bascom ja die Bitnamen kennen. Also eigentlich sollest Du zB statt "PCICR.0=1" schreiben können "PCICR.PCIE0=1", wodurch der Code etwas lesbarer wird - aus dem Kopf weiß ich nämlich nicht, was PCICR.0 ist.

Der PCINT0, also der Interrupt (nicht der Pin) wird bei jedem Pegelwechsel aller, im PCMSK0-Register entsprechend maskierten Bits (PCINT7..PCINT0 - hier sinds die Pins!) ausgelöst. Soweit klar?

Zu deinen Timern und den Brücken: gib das mal konkreter an. Also die Verschaltung, und wie die Timer laufen.
Laufen die Timer immer (und du veränderst nur die OutputCompareRegister und/oder den WaveformGenerationMode), oder hältst Du die Timer auch an?
Wenn einer der Timer immer läuft (was hier sinniger ist), dann kann er Dein PWM in Hardware im Hintergrund erledigen (mit 2 Kanälen), und nebenbei 'ne Zeitbasis generieren (Überlauf), die für alles mögliche verwendbar ist.
 
Yippy,

Das ist aber auch blöd erklärt in dem Datenblatt.

Code:
'Autosteuerung
$regfile = "m88def.dat"
$crystal = 256000
$hwstack = 40
$swstack = 40
$framesize = 40

Dim I As Integer
Dim I2 As Integer

Config Portc.3 = Output
Config Portc.2 = Output

Enable Interrupts
Enable Pcint0

Pcmsk0.pcint1 = 1


On Pcint0 Lesen:

Do
 Portc.3 = 1
 Waitms 100
 Portc.3 = 0
 Waitms 100
Loop

Lesen:
 Toggle Portc.2
Return


End

So gehts erstmal. weiteres folgt:D:D:D
 
Genau das wollte ich:

Code:
'Autosteuerung
$regfile = "m88def.dat"
$crystal = 512000
$hwstack = 40
$swstack = 40
$framesize = 40

Dim I As Integer
Dim I2 As Integer

Config Portd.3 = Output
Config Portd.2 = Output
Config Portd.1 = Output

Config Timer1 = Counter , Prescale = 1
Enable Timer1

'Display Einrichten
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portd.7 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portb.4 , Rs = Portb.5
Config Lcd = 16 * 2
Cursor Off
Cls

Enable Interrupts
Enable Pcint0
Enable Pcint1

Pcmsk0 = &B00000010
Pcmsk1 = &B00001000

On Pcint0 Lesen1
On Pcint1 Lesen2



Do
 Portd.1 = 1
 Upperline : Lcd "  " ; I ; "  "
 Lowerline : Lcd "  " ; I2 ; "  "
 Portd.1 = 0

Loop

Lesen1:
 If Pinb.1 = 1 Then
    Timer1 = 0
 Else
     I = Timer1
 End If

 Toggle Portd.3
Return

Lesen2:
 If Pinc.3 = 1 Then
    Timer1 = 0
 Else
     I2 = Timer1
 End If

 Toggle Portd.2
Return

End

beide Kanäle werden getrennt erkannt mit:
high 29500
middle 22600
low 15300

und das Programm läuft mit ca 3,5 khz durch für die Berechnungen und Ausgaben.
 

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