Bascom BASCOM ; Erste Schritte zum Ausprobieren

Naja, das ist doch nur lesen. Ok, ist - wie fast alles - Englisch, aus gutem Grund.
Hast du denn überhaupt verstanden wie I2C überhaupt funktioniert? Erklär mal.
 
Vom µC gehen die Daten in den PCF-Chip und werden dort an die einzelnen Daten Pins aufgeteilt und weitergeleitet. Ich denke mal so, wie bei einer Telefonleitung. Das sind ja im Prinzip auch nur zwei Leitungen, auf denen allerdings ne ganze Menge verschiedene Daten fließen.
 
Ja, ähnlich. Ich meinte das eher Protokolltechnisch.
I2C ist ja keine Ende-zu-Ende Verbindung, sondern ein Bussystem.
 
Protokoll.
Nehmen wir mal als Beispiel Telefon. Du hast eine Leitung, kannst darüber aber zig verschiedene Teilnehmer erreichen.
Es ist ja nicht direkt verbunden. Dann bräuchtest du pro Telefonnummer die es gibt eine zusätzliche Leitung. So viel Kupfer gibt es auf der Erde nicht.
Vom Internet mal ganz zu schweigen, hier wären es IP Adressen.
Daher wird ein Protokoll definiert.
Detailierter: https://de.wikipedia.org/wiki/Kommunikationsprotokoll

Busssystem.
Wenn mehrere Teilnehmer (Fahrgäste) sich den selben Transport (Bus) teilen.
Detailierter: https://de.wikipedia.org/wiki/Bus_(Datenverarbeitung)

Zu I2C bietet die Wikipedia auch gute Informationen: https://de.wikipedia.org/wiki/I²C

Lies das erst mal, wenn du Fragen hast frag ruhig :)
 
I2cwbyte &B10010000
Bin gerade bei Oktett. Dabei ist mir aufgefallen, dass du die obige Binärzahl in Dezimal 90 angegeben hast.
Wenn ich das Binärsystem richtig verstanden habe, müsste die Dezimalzahl 144 sein.
Bitte überprüfen, damit ich mir nichts falsches einpräge.
Es ist sehr viel zu lesen. Ich muss Schritt für Schritt vorgehen und mir Notizen machen. Ich weiß am Ende eh nicht mehr, was ich am Anfang gelesen habe. Bin halt schon ein bisschen verkalkt. Aber deshalb trainiere ich auch. :read:
 
Das ist die binäre Schreibweise.
Ich hatte Hex 90 geschrieben, ist aber A0, um einen vertan, sorry.
Dezimal 160

Hex 90 wäre dec 144, ja.

Kannst du aber im Windows Taschenrechner auch sehen wenn du auf die Programmiereransiicht wechselt.
 
Soweit ganz gut, und das gibt es (wahrscheinlich) auch bei anderen Sprachen - das Problem ist für mich die Dokumentation (der Biblioheken).
Das hört sich ja erstmal garnicht so schlecht an, aber die Dokumentation finde ich auch – ähm – ziemlich dürftig. Wenn es nicht auf Anhieb läuft, hat man eher schlechte Karten.
Bascom kennt ja doch eine ganze Menge Displays, sogar FTDI. Verwirrend finde ich aber, daß man mal die Auflösung (z.B. 20X4 oder 20X4A (was bedeutet das A?)), mal den Namen (DOG163V3) oder ein anderes Mal wieder den Controller (KS077) angeben muß.
Du kannst natürlich problemlos selbst auch alles im Code schreiben, ohne die vorgegebenen LCD-Instruktionen zu verwenden
Das war mir schon klar. Bascom wird aber wohl deswegen gerne von Anfängern benutzt, weil man das eben grade nicht tun muß, ;)


CodeBox BascomAVR
I2cinit
I2cstart                                'Die Schnittstelle öffnen
I2cwbyte &B10010000                     'Schreibadresse auf den Bus senden
I2cstop                                 'Die Schnittstelle Wieder Freigeben
Config Lcd = 16 * 2                     'nicht unbedingt nötig
Config I2cdelay = 1
Dann wird also der I2C-Chip vor dem LCD initialisiert, so wie es sein sollte.
Wofür wird dann noch die Schreibadresse gesendet, das müßte Bascom doch automatisch machen.

Aber egal. Wenn ich die Beschreibung für CONFIG I2CDELAY richtig verstanden habe, wird nach der Initialisierung des LCD die I2C-Frequenz auf 1 MHz umgestellt.
Mit dem Default-Wert von 5 (für 200 kHz) würde es auch nicht gehen,
der PCF8574 kann nämlich nur 100 kHz...
und dafür müßte dann statt der 1 eine 10 da stehen...
 
Lies das erst mal, wenn du Fragen hast frag ruhig
Ich habe das jetzt hin un her (mit den einzelnen Wiki Erlärungen) durchgearbeitet. Wie ich jetzt ein Protokoll, zu einem mir noch unbekannten Bus aufbauen kann, ist mir immer noch ein Rätsel. Das eine ist das Bussystem, das mehrere Leitungen verwaltet. Und dann noch, wer ist der Master und wer Slave?
 
Da ich mein vier Zeilen I2C LCD auf Bascom nicht zum laufen bekommen werde, muss ich mich halt mit dem verkabelten normalen zwei Zeilen LCD begnügen.
Dazu habe ich mir allerdings eine Platine mit nur einem Taster an B0 ohne externen Quarz angefertigt.
LCD-Platine.jpg
Ich würde damit gern eine einfache Uhr zum einstellen, also keine Funkgesteuerte realisieren. Jetzt ist die Frage, ist das mit nur einem Taster überhaupt möglich und wie fange ich am besten an?
 
ist das mit nur einem Taster überhaupt möglich
Natürlich, Du kanst den Taster ja lang oder kurz betätigen - einfach-/doppel-/dreifachklicken oder sowas. Daß die Bedienung einfach sein soll, hast Du ja nicht gefordert...
und wie fange ich am besten an?
Am sinnigsten wäre bei dem Ziel, erstmal einfach im Sekundentakt ... ähm ... die Sekunden seit dem Start ausgeben zu lassen.
Als zweiten Schritt könnte man dann ein Uhrwerk implementieren, daß nach dem Programmstart einfach bei 00:00:00 beginnt (aber eben Stunden, Minuten und Sekunden korrekt zählt und ausgiebt.
Schritt drei könnte sein, die Uhr bei Tasterbetätigung (konkret beim loslassen) auf null zurückzusetzen.
Schritt vier wäre, unterschiedlich lange Tasterbetätigungen (oder Mehrfachbetätigungen) auszuwerten (und auf der zweiten Zeile auszugeben).
Danach könntest Du Dir weitere Gedanken zum Stellen der Uhr machen
 
lang oder kurz betätigen
Das ist eine gute Lösung. Aber kannst du mir erklären, wie das im Code geschrieben wird, dass der Taster kurz oder lang gedrückt ist. Wie wird das vom µC erkannt und ausgewertet.
Den Sekundentakt, so wie du mir es Anfang beigebracht hast? Wenn ja, ist das ja ein sehr vielseitig Anwendbarer Code und kann diesen als Grundgerüst für jegliche Anwendungen, die mit Sekundentakt arbeiten, festlegen.
Das Uhrwerk dann mit If...Anweisungen?
 
Ich habe das jetzt hin un her (mit den einzelnen Wiki Erlärungen) durchgearbeitet. Wie ich jetzt ein Protokoll, zu einem mir noch unbekannten Bus aufbauen kann, ist mir immer noch ein Rätsel. Das eine ist das Bussystem, das mehrere Leitungen verwaltet. Und dann noch, wer ist der Master und wer Slave?
Du musst dir kein Protokoll ausdenken, I2C ist quasi schon das Protokoll.
1.: 2 Leitungen, Clock und Daten.
2.: Beide sind Idle High, sowohl Master alsauch Slaves können die runter ziehen*
Daher musst du auch Pull-Ups an beiden Leitungen anbringen. Der Wert ist hier egal, irgendwas um die 10k ist ok.
Soviel zur Hardware. Software:
3.: Master sendet eine Start Kondition auf den Bus (idealerweise nur wenn er frei ist, also beide Leitungen länger High waren). SDA geht Low.
4. Die Adresse wird bitweise übertragen (7 Bit) + Read/Write Bit. Das ist das erste Byte was immer der Master sendet.
5. Der Slave antwortet mit einem Bit, ob er weitere Daten empfangen oder senden möchte.
6. Nach einem NACK (keine weitern Daten) wird die Stop Kondition hergestellt, also der Ausgangspunkt, beide High.

*: SDA ist nur gültig, wenn SCL high ist. Das hat den Vorteil dass ein Slave, wenn er die Daten nicht schnell genug verarbeiten kann, SCK auf Low ziehen kann und somit die Kommunikation ausbremsen kann, falls nötig.

Das Display selbst hat kein Protokoll ansich. Höchstes ein ganz einfaches, was du aber idR nicht brauchst.
 
SDA ist nur gültig, wenn SCL high ist. Das hat den Vorteil dass ein Slave, wenn er die Daten nicht schnell genug verarbeiten kann, SCK auf Low ziehen kann und somit die Kommunikation ausbremsen kann, falls nötig.
Vorsicht!!!
Das ist ungenau formuliert. SDA darf vom Slave nur geändert werden, solange SCL low ist also nicht geändert werden, wenn SCL high ist. Ändert der Master SDA während SCL High ist, erzeugt er damit 'ne Start- bzw Stop-Condition.

Ein Slave darf SCL nie(!!) auf low ziehen - er darf die Leitung nur auf low halten, wenn sie bereits low ist, um die Clock zu stretchen.
 
Aber kannst du mir erklären, wie das im Code geschrieben wird, dass der Taster kurz oder lang gedrückt ist. Wie wird das vom µC erkannt und ausgewertet.
Bisher schaust Du ja immer nur einmal auf den Taster, also ob er high oder low ist. Wenn Du eine lange Beätigung erkennen willst, mußt Du halt oft schauen, und nur wenn der Taster bei zwanzigmal(*) schauen jedesmal low war, reagieren.
Elegant läßt sich dabei der "Alabel'sche Schiebetrick" anwenden, ggf sogar doppelt...

(*) Zahl aus der Luft gegriffen - sinnigerweise nimmt man irgendwelche Zweierpotenzen, die AVR sind ja binäre Käfer...

Ups... sollte eigentlich im letzten Beiträg hinzugefügt werden - zu schnell geklickt...
 
Wenn Du prüfen willst, wielange ein Bein low (oder high) ist, kannst Du natürlich die verstrichenen Timer-Takte zwischen den Flanken zählen. Entweder Du merkst Dir den Startwert des Timers, und bildest die Differenz, oder Du setzt den Timer beim Start zurück.

Wenn Du aber nur'ne Zeitschwelle willst (Taster länger als xyz gedrückt), kannst Du auch regelmäßig (sagen wir mal jede Zehntelsekunde) den Wert des Beins (1 oder 0) als Bit aufschreiben. Hast Du:
11111111 war der Taster nie betätigt.
11011111 hat er mal ganz kurz ausgelöst.
10100111 hat er geprellt/gezappelt
00000000 wurde er mindestens 0,8s betätigt, und bisher nicht (erkennbar) losgelassen.
00000001 wurde er nach mindestens 0,7s Betätigung losgelassen.

Der Trick ist der, nicht mit irgendwelchen Vergleichen (Compare bzw If-Konstrukten) abzufragen, ob das Bein Hi oder low ist, sondern einfach den Inhalt des Speicherregisters um eins zu verschieben und der Beinzustand quasi dazuaddiert wird. Ist das Speicherregister danach =0 (Zero Flag wird automatisch beim addieren/inkrementieren manipuliert), war der Taster die letzten 8 Überprüfungen gedrückt, sonst nicht.

Ursprünglich hat Alabel den Weg zum ignorieren von Tasterprellen verwendet (ob er den selbst entwickelt hat, kann ich nicht sagen, aber daher kenne ich ihn).
 
den Wert des Beins (1 oder 0) als Bit aufschreiben
Auf der Suche, wie man das im Code schreibt, bin ich auf etwas gestoßen, was mich stutzig macht.
Gefunden habe ich diesen Code.
Ist zwar alles gut beschrieben, aber wo wird irgendetwas geschaltet?


CodeBox BascomAVR
'Debouncetimer
'V1.0.0
'22.09.2012
'BASCOM 2.0.7.5
'---------
'-
'---------
'Tasterentprellung mit Debounce-Befehl und Zeitauswertung
'Bei Erkennung eines Tastendruckes wird 5ms gewartet, bleibt der Taster gedrückt
'wird D0_active angesprungen. Dort wird ein Flag gesetzt und wieder zur Hauptschleife
'zurückgekehrt. Der Timer0 erzeugt ca. alle 10ms einen Interrupt; wenn das Flag
'gesetzt ist wird die Variable Count hochgezählt. Wird der Taster losgelassen
'und Count hat den Wert 51 noch nicht erreicht, wird ein kurzer Tastendruck gezählt.
'Erreicht Count den Wert 51 wird ein langer Tastendruck gezählt.
'Kurzer Tastendruck: <500ms
'Langer Tastendruck:  510ms
'---------

$regfile = "m32def.dat"
$crystal = 1000000
$hwstack = 32
$swstack = 8
$framesize = 32

'KONFIGURATION PORTS
Config Pind.0 = Input
Portd.0 = 1
'KONFIGURATION TIMER0 (10ms)
Config Timer0 = Timer , Prescale = 64
On Timer0 Isr_timer0
Timer0 = 100
Enable Timer0
Start Timer0
'KONFIGURATION DEBOUNCE
Config Debounce = 5                                         '5ms Auswertedauer des Tasters
'VARIABLEN
Dim Flag As Bit
Dim Count As Byte
Dim Pressed_short As Byte                                   'Zähler für kurze Tastendrücke
Dim Pressed_long As Byte                                    'Zähler für lange Tastendrücke
Enable Interrupts
'### HAUPTSCHLEIFE ###
Do
   Debounce Pind.0 , 0 , D0_active , Sub
   If Flag = 1 Then
      If Pind.0 = 1 And Count < 50 Then                     'Auswertung des kurzen Tastendrucks
         Pressed_short = Pressed_short + 1                  'Zählen des kurzen Tastendrucks
         Flag = 0
         Count = 0
      End If
      If Count > 50 Then                                    'Auswertung des langen Tastendrucks
         Pressed_long = Pressed_long + 1                    'Zählen des langen Tastendrucks
         Flag = 0
         Count = 0
      End If
   End If
Loop
'### ISR ###
Isr_timer0:
   Timer0 = 100
   If Flag = 1 Then Count = Count + 1
Return
'### SUB ###
D0_active:
   Set Flag
Return
End
 
Hallo @LotadaC , @TommyB
Noch einmal zurück zum I2C.
Da die Programmierung und auch das I2C LCD bei Arduino funktionieren, hab ich mir die Frage gestellt, ob es an meinem USBASP Programmierer liegen kann.
Das Arduino Board hat ja einen Bootloader auf dem Chip, dass da irgend etwas mit meinem Progammierer nicht stimmt.
 

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