Bascom BASCOM ; Erste Schritte zum Ausprobieren

Da bei dir der Pin direkt mit VCC verbunden ist müsstest du schon Avcc oder VCC(?) nehmen (im Config ADC Befehl).
Nein. Das ist zwar ungefährlich, aber strenggenommen trotzdem falsch.
Beim verwendeten Mega8 gilt bei Config ADC reference model 8 - für Reference = ... können also folgende diskrete Einträge folgen:
  • Aref bzw Off - es liegt intern keine Spannung auf dem Bein, diese muß also extern über das Bein auf den DAC geleitet werden.
  • AVcc - intern wird AVcc mit dem Bein (und somit auch dem DAC) verbunden, und sollte am Bein mit einem Kerko gestützt werden.
  • Internal bzw Internal_2.56 - intern wird die interne 2,56V-Referenz mit dem Bein verbunden, und sollte mit einem Kerko gestützt werden.
Die erste Variante erwartet also 'ne Spannung am Bein, die anderen beiden liefern 'ne Spannung am Bein. Da die Platine aber immer extern eine Spannung auf das Bein legt, darf mit diesem Board nur der erste Eintrag (Aref bzw Off) verwendet werden. Insbesondere kann nie gegen irgendeine andere (egal ob interne oder externe) andere Referenz gemessen werden als Vcc.
Das Board soll ja auch kompatibel zum ATmega48/88/168(P/PA) sein - der besitzt statt der 2,56V eine 1,1V-Referenz, welche auch für den dort ebenfalls vorhandenen Temperatur"sensor" zu verwenden wäre - kannste dann auch knicken (bzw die Genauigkeit auf höchstens ein fünftel reduzieren...)
Es gibt überhaupt keinen Grund, extern AVcc an das bein anzuklemmen - wenn nötig kann man das intern schalten.

Das ist in etwa so, als wenn Du im Auto Deine Sitzheizung fest an die Batterie/Lichtmaschine anlötest. Da frierst Du im Winter dann auch nicht mehr so doll, wenn Du keinen Bock hast, den Schalter zu betätigen.
Und im (Hoch-)Sommer muß die Klimaanlage dann eben etwas mehr leisten...
Muss man erst noch Digital I/O deaktivieren?
Nein, also nicht deswegen (und beim Mega8 gibts auch gar kein DIDRn, wenn ich mich recht erinner).
Die Pins sind immer mit dem Eingangsmultiplexer des ADC verbunden. Wenn das Bein Ausgang ist, kannst Du also je nach Pegel (etwa) 0 bzw (etwa) 1023 erhalten (wenn die zu messende Spannung über der Referenz liegt, ist das ergebnis auch immer 1023). Die digitalen Eingangspuffer schaltest Du im analogbetrieb eigentlich nicht wegen dem ADC/AC ab, sondern weil bei Vcc/2 die Buffer sonst ggf flattern, und dadurch viel Strom fließt (ok, das flattern kann sich natürlich auch auf die Genauigkeit eines schwachen Eingangssignals auswirken/stören).
Wenn das Bein Eingang ist, kannst Du zB auch den internen Pullup als Bestandteil eines Spannungsteilers nutzen, bei der ADC-Messung.
 
Ich habe jetzt den Atmega8 auf ein Steckboard gesetzt, Vcc, GND und 100nF Kondensatoren gesetzt. Das Ergebnis ist das gleiche, wie ich schon in #436 geschildert habe. Könnte im Code etwas falsch ein?
 

Anhänge

  • 300px-Adc_connection.png
    300px-Adc_connection.png
    38,8 KB · Aufrufe: 6
Ok, ich hab immer mit DIDRx getrennt. Wenn das nicht geht liegt es vermutlich am gesetzen Pullup.
Schaltplan sieht ok aus, wenn auch etwas wild gezeichnet. C4 und R1 bräuchtest du noch nicht mal, ist aber nicht relevant für das Problem.
ADC0 ist bei dir jetzt C0.
Setz zum Testen mal DDRC.0 auf 0 (oder 1? müsste selbst nach schaun) und PORTC.0 auf 0
Vielleicht war es das schon. Wenn ja hat der interne PullUp rein gefunkt. Wenn nicht müssen wir weiter suchen.
 
Ok, das war es gewesen.
Ddrc = &B_11_1110
Portc = &B00_0000
und so haut alles hin. Da muss ich irgendwann mal einen Taster dran gehabt haben und beim kopieren immer wieder mitgenommen.
Danke.
 
Ne, stimmt ja gar nicht. Taster wäre ja Ddrc = &B_11_1110, denke ma das das der Pullup ist?
 
Musst jetzt nicht den ganzen DDR und PORT beschreiben, das Bit reicht ;)
Vielleicht brauchst du die Beinchen später mal andersweitig, denn würde sich alles gegenseitig überschreiben.
DDR schaltet um zwischen Ein- und Ausgang. PORT sagt (bei Eingang) ob der PullUp aktiv ist oder nicht, respektive (Ausgang) legt es den Pegel fest.
Dein AVR hatte also vorher brav den Pegel gehalten der vorgegeben war, also den Schleifer kurz geschlossen. Bis er halt nicht mehr konnte. Wenn der Poti noch lebt, weißte jetzt wer der stärkere ist ^^
Wobei die AVR's nahezu unkaputtbar sind. Also ich hab noch keinen geschrottet. Also keine Sorgen :)

Edit: DDR = Data Direction Register
 
Ja, ist alles klar. Ich habe in #444 und #445 alles durcheinander geschmissen. In #205 als ich den Poti dazugesetzt habe, waren die Ports noch einzeln aufgeführt. Einen Portc.0 war weder als Eingang noch als Ausgang deklariert. Erst in #352 Gosub hatte ich die Data Directory Register und da wiederum kein ADC verwendet.
 
R1 : Der Controller hat auch am Reset-Bein einen internen Pullup (30..50 kOhm denk ich) und der ist dann immer aktiv. Wenn Du nicht in extremen Industriebedingungen arbeitest, und/oder 'ne lange Antenne am Bein hast, reicht der.
Der Kondensator bildet mit dem Widerstand einen Tiefpaß (Windkessel). Ein prellender Taster/ein zittern des Signal würde dort in Hardware rausgefiltert werden. Das Reset-Unit besitzt aber intern 'nen eigenen ... ähm ... eher digitalen Tiefpaß - so'n externen brauchst Du also nicht. Und Dein Programmer legt da eh ordentliche Pegel mit steilen Flanken drauf...
 
debugWire geht seriell über Reset. Möchte / kann man das nutzen (nicht jeder Programmer unterstützt es, Bascom erst recht nicht), ist der Tiefpass da falsch.
 
Zum Lichtsensor, es kommt auf den Typ drauf an und wie du ihn verwenden möchtest.
Ich habe jetzt eigentlich das, was ich habe wollte. Den genauen Wert, für den LDR bekommt man ja über das Terminal ausgegeben. Das mit dem Taster und einer bestimmten Zeit hatte ich mir einfacher vorgestellt als mit der Helligkeitsregelung. Zu mindestens habe einige Abläufe begriffen und somit (hoffentlich richtig) diesen Code zusammengestellt. Ich habe auch alles andere raus genommen, was nicht nötig war bzw. weil irgendetwas nicht richtig funktionierte.
Ich wollte mein vorhandenes Kerzenlicht nicht ständig laufen lassen (was soll eine Kerze bei Tageslicht). Somit habe ich es jetzt zwar den Code auf einen Mega8, der aber zu groß für meine vorhandene Kerze ist. Jetzt muss ich diesen Code für eine Tiny13a realisieren.

CodeBox BascomAVR
$regfile = "m8def.dat"                  'Controllerdefinitionsdatei einbinden
$crystal = 8000000                      'Systemtakt angeben (Baudrate)
$hwstack = 40                           'Stacks
$swstack = 16
$framesize = 32
$baud = 19200                           'Baudrate UART
Dim Fla As Byte
Dim Pause As Byte
Dim Pausex2 As Byte
Dim Tov1cnt As Byte
Dim Ldr As Word
Ddrc = &B_11_1110                       '1 ist Ausgang 0 ist Eingang
Portc = &B00_0000                       'auf Hi oder Low setzen
Ddrd = &B_1111_1111
Portd = &B0000_0000
Rot Alias Portd.7
Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Adc = Free , Prescaler = Auto , Reference = Avcc
On Timer1 Ontimer1overflow
Enable Timer1
On Adc Onadc
Enable Adc
Enable Interrupts
Main:
   Config Powermode = Idle
   'If Ischarwaiting() = 1 Then Gosub Onuartrx
   'If Tifr.tov1 = 1 Then Gosub Ontimer1overflow
   'If Key1 = 0 Then Gosub Onkey1pressed
   Goto Main
Ontimer1overflow:
   Set Tifr.tov1                        'Überlaufflag zurücksetzen
   Incr Tov1cnt                         'überlaufzähler inkrementieren
   If Pause = Tov1cnt Then              'entspricht dem 2ten "waitms pause"
      Fla = Rnd(200)
      Fla = Fla + 55
      Pwm1a = Fla
   End If
   If Pausex2 = Tov1cnt Then            'entspricht dem ersten "waitms pause"
      Pwm1b = 255 - Fla
      Pause = Rnd(10)
      Pause = Pause * 6
      Pausex2 = Pause
      Shift Pausex2 , Left              'pausex2=pause*2
      Tov1cnt = 0
   End If
Return
Onadc:
   Ldr = Getadc(0)
   If Ldr < 356 Then
      Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
   Else
      Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect
   End If
Return
 
Das wird jetzt etwas schwieriger.
1.: Also Timer1 muss zu Timer0 werden, das kannst du noch am Mega machen, daher erster Schritt. Vorsicht, die Timings werden sich ändern, Timer0 ist nur 8 Bit, Timer1 aber 16 Bit. Dementsprechend wäre es auch PWM0a, TOV0, usw.
Später:
2.: Die Pinbelegung, also DDRx, PORTx, PINx ist möglicherweise anders. -> anpassen.
3.: Hoffen dass der Bascom Code noch in den Tiny passt. Ab hier bin ich dann raus, falls nicht.
 
Ich bin gerade dabei, die Sache auf 8 Bit zu ändern. Weiß aber noch nicht, wie ich diese Zeilen

CodeBox BascomAVR
If Tifr.tov1 = 1 Then                'wenn Timer übergelaufen ist
      Tifr.tov1 = 1                     'Überlaufflag zurücksetzen
      Incr Z
      If Z = 245 Then                   'Überläufe zählen (245)
         Z = 0                          'Zähler zurücksetzen
         Toggle Gruen                   'LED toggeln
hin bekommen soll.
Werde wohl noch ein bisschen lesen müssen.
 
Eigentlich dürften nur Zeile 1 und 2 fehlerhaft sein. Laut Datenblatt heißt "Tifr.tov1" (zum Verständnis: Timer Interrupt Flag Register . Timer OVerflow (of Timer) 1)
Etwas anders:
Klar, die 1 muss zur 0. Wir wollen ja Timer 0 nutzen statt 1. Und beim ATtiny heißt das Register laut Datenblatt TIFR0 - Beim Mega8 TIFR (ohne Nummer)! *narf*
Denk dran, die Pinbelegung ändert sich dementsprechend. Von OC1a/OC1b auf OC0a/OC0b
Was jetzt prinzipiell etwas blöd ist, weil der Mega8 führt OC0x gar nicht direkt an die Pins... Hmm...
 
Nö, du musst eigentlich nur die Register anpassen, eben von 1 auf 0. Also:


CodeBox BascomAVR
If Tifr.tov1 = 1 Then                'wenn Timer übergelaufen ist
      Tifr.tov1 = 1                     'Überlaufflag zurücksetzen

zu


CodeBox BascomAVR
If Tifr.tov0 = 1 Then                'wenn Timer übergelaufen ist
      Tifr.tov0 = 1                     'Überlaufflag zurücksetzen

Problem hierbei: Die Ausgänge lassen sich nicht direkt zuweisen wie beim Timer 1. Blöd, weil man sieht nix.
Der Tiny13 kann es, da wäre es dann


CodeBox BascomAVR
If Tifr0.tov0 = 1 Then                'wenn Timer übergelaufen ist
      Tifr0.tov0 = 1                     'Überlaufflag zurücksetzen

Wobei ich glaube dass die 2 Zeilen (+ der End If) bei Interrupts gar nicht mehr nötig sind. Das müsste entweder ein Bascom Experte beantworten, oder du selber austesten :)
 
Das mit der "0" bei TIFR habe ich noch nicht gewusst. Ich habe somit noch einmal #145, ohne den UART, mit dem Tiny weiter gemacht. Grün toggelt zwar, aber nicht im Sekundentakt. Das andere Problem, ist der Kerzen-Code von LotadaC, den ich später eingefügt habe. Dieser zeigt in Zeile 20 erst einmal einen Fehler.
Das "TOV0" ist klar aber das "cnt" dahinter?
Ich habe zwar im Datenblatt gesucht. Wenn ich allerdings keinen blassen Schimmer habe, was diese ganzen Bezeichnungen für eine Bedeutung haben kann ich nur experimentieren.
Als ich ganz am Anfang diesen Kerzen-Code bekommen habe (Code ohne waitms musste es sein), habe ich den Ablauf mir schon in etwa vorstellen können. Ich hatte ja einen Code, allerdings mit waitms, welches ja weg musste. Kam nicht dazu, zu fragen, was "cnt" für eine Bedeutung hat.

CodeBox BascomAVR
$regfile = "attiny13a.dat"              'Controllerdefinitionsdatei einbinden
$crystal = 8000000                      'Systemtakt angeben (Baudrate)
$hwstack = 16                           'Stacks
$swstack = 8
$framesize = 16
Dim Z As Byte
Dim Fla As Byte
Dim Pause As Byte
Dim Pausex2 As Byte
Dim Tov1cnt As Byte
Rot Alias Portb.3                       'Namen für LED-Beine
Gruen Alias Portb.4                     'Ausgänge
Config Gruen = Output
'Phasenkorrekter 8-Bit-PWM, PWM-Frequenz=245Hz
Config Timer0 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Start Timer0
Do
   If Tifr0.tov0 = 1 Then               'wenn Timer übergelaufen ist
      Set Tifr0.tov0                    'Überlaufflag zurücksetzen
      Incr Tov0cnt                      'überlaufzähler inkrementieren
      If Pause = Tov0cnt Then           'entspricht dem 2ten "waitms pause"
         Fla = Rnd(200)
         Fla = Fla + 55
         Pwm0a = Fla
      End If
      If Pausex2 = Tov0cnt Then         'entspricht dem ersten "waitms pause"
         Pwm0b = 255 - Fla
         Pause = Rnd(10)
         Pause = Pause * 6
         Pausex2 = Pause
         Shift Pausex2 , Left           'pausex2=pause*2
         Tov0cnt = 0
      End If
      Incr Z
      If Z = 245 Then                   'Überläufe zählen (245)
         Z = 0                          'Zähler zurücksetzen
         Toggle Gruen                   'LED toggeln
      End If
   End If
Loop
End
 
Gut dass wir die grüne Test-LED noch haben :)
Naja, der Timer1 (also 16 Bit) rennt halt, wenn man ihn nicht eingeschränkt hat, von 0..65535. Ein 8bitter (Timer 0 oder 2) nur von 0..255. Dementsprechend tritt der Überlauf auch wesentlich häufiger auf, es läuft also (in diesem Programm) auch alles schneller, ziemlich genau 256x so schnell.
Jetzt könnte man meinen, Prescale einfach auf 16.320 setzen (64*256). Gut gedacht, aber blöd, weil das der Controller nicht unterstützt.
Der Inhalt der ISR darf also nicht so oft wie vorher ausgeführt werden.
Schon eine Idee?

Jetzt mal global gesehen, also nicht nur für diesen Anwendungszweck. Natürlich kann man trotzdem den Prescaler erhöhen. Aber es ändern sich dann halt auch alle Zeitwerte die in der ISR definiert sind. Man könnte auch die CPU Clock verändern / dividieren... Zu viel erst mal.

:offtopic:
@LotadaC: Ist der Flacker Code eigentlich für einen 8 Bit Timer?
 
@LotadaC: Ist der Flacker Code eigentlich für einen 8 Bit Timer?
Jain - wie im Code ursprünglich mal dokumetiert war, wird der 16-Bit-Timer im phasenkorrekten 8-Bit-PWM betrieben, also zwischen 0..255 hin und her (dual slope). Das entsprechende Config Timer und den Flacker-Algorythmus hatte Heini geliefert (ich hatte den nur auf Wait-Free umgeschrieben).

Ob der Timer des 13a dualSlope kann, weiß ich grad nicht - aber selbst im singleSlope (fastPWM) sollte das Flackern ähnlich sein...
 

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