Bascom BASCOM ; Erste Schritte zum Ausprobieren

Du hast Zeile 10 vergessen umzubenennen.
Es ist nur ein Zähler der die Überläufe, also die Anzahl der Interrupts zählt.
 
Du hast ein wachsames Auge. Danke!
Mit Prescale = 8 blinkt Grün im Sekundentakt, denk ich mal.
Die Pwm macht leider noch nichts.
 
Ich dachte mal Frequenz 1 MHz / 8 =120000 Hz, im Phasenkorrekter 8-Bit-PWM /510 Schritte = 245.
Aber die Pwm tut's immer noch nicht.
Ich dachte mal Frequenz 1 MHz / 8 =120000 Hz, im Phasenkorrekter 8-Bit-PWM /510 Schritte = 245.
Aber die Pwm tut's immer noch nicht.
 
Ist jetzt ein Schuss in's Blaue!

Aber, der Tiny13 hat nur 64 Byte RAM.
Mit den Zeilen


CodeBox BascomAVR
$hwstack = 40                           'Stacks
$swstack = 16
$framesize = 32

belegst du schon 88. Bissl zu viel ;)
Dazu noch


CodeBox BascomAVR
Dim Fla As Byte
Dim Pause As Byte
Dim Pausex2 As Byte
Dim Tov1cnt As Byte
Dim Ldr As Word

Sind noch mal 6.

hwstack wird benötigt für Rücksprungadressen, also bei jedem Gosub / Call und Return. Der ist per Hardware festgelegt und füllt den Speicher von hinten nach vorne auf. Da wir nicht verschachteln, also eine Routine ruft die Andere auf, sollte 4 reichen, 2 wegen dem GoSub und noch mal 2 wegen Interrupts.
swstack wird von Bascom benötigt wenn du mit Routinen oder Funktionen arbeitest, um Parameter und Rückgabewerte zu speichern. Genau genommen nur die Adresse des Wertes. Machen wir aber nicht, sollte auf 0 können.
framesize. Im Frame werden die Parameter abgelegt auf die der swstack verweist. Machen wir nicht, 0.
Ich würde die Werte jetzt nicht zu knapp bemessen. Man kann unmöglich einschätzen wie zur Verfügung gestellte Routinen wie z.B. rnd intern umgesetzt werden. Ich glaube Bascom hatte sogar eine Art die Maximalwerte im Simulator zu ermitteln. Zumindest der hwstack ist überschaubar, und die Variablen die du selber definierst.
Also, 6 Bytes müssen frei bleiben von den 64. Bleiben 58. Probier mal:


CodeBox BascomAVR
$hwstack = 32
$swstack = 6
$framesize = 20

Damit ist dein RAM aber schon voll belegt. Niedrigere Werte müssten gehen. Bei Bedarf (neuen DIM's) kleinere testen.

Wundert mich dass Bascom gar nicht meckert, zumindest mit Warnungen.
Ich weiß jetzt nicht wie das Speichermanagement ist wenn man es übertreibt. Gut möglich dass Werte einfach irgendwo hin gespeichert werden, weil der Addresszähler überläuft.

Detailliertere Erklärung:
 
Das ist eigenartig, beim Mega8 sind die Portb.1 und Portb.2 nicht als Ausgang deklariert worden. Das habe ich beim Tiny jetzt hinzu gefügt und funktioniert.
 
Ah, stimmt, übersehen. Hatte noch den Code davor genutzt, fälschlicherweise.
Bei mir ist es reine Angewohnheit die Ausgangs-Pins immer auf Ausgang zu setzen. Eigentlich sollte der Timer das automatisch machen. Beim t13 wohl nicht. Naja, man lernt nie aus. Aber ist ja gut dass es jetzt geht :)
 
Leider nicht so richtig. Beim Mega8 habe ich den Poti durch den LDR ersetzt und schaltet auch. Beim Tiny habe ich PB3 als ADC Eingang gesetzt sowie auch im Code Getadc(3). Hat aber keine Reaktion - warum nicht?
 
Gut möglich dass die Werte von GetADC anders sind. Versuch mal ohne LDR und schließ den Pin abwechselnd mit GND und VCC kurz. Funktioniert das, andere Werte probieren. Leider hat der t13 kein UART, dass man was "sehen" könnte
 
Moooooment... #457. Da ist der ADC auch komplett raus geflogen. Dann kann es natürlich auch nicht gehen.
 
Kannst Du hier bitte mal drüber schauen. Die LDR Werte hab ich hoch und runter geschraubt - Pwm ist ständig am laufen.

CodeBox BascomAVR
$regfile = "attiny13a.dat"              'Controllerdefinitionsdatei einbinden
$crystal = 1000000                      'Systemtakt angeben (Baudrate)
$hwstack = 32                           'Stacks
$swstack = 10
$framesize = 10
Dim C As Byte
Dim Fla As Byte
Dim Pause As Byte
Dim Pausex2 As Byte
Dim Tov0cnt As Byte
Dim Ldr As Word
Ddrb = &B10_1111
Portb = &B00_0000
Gruen Alias Portb.3
'Phasenkorrekter 8-Bit-PWM = 0-255 und 255-0 = 510, PWM-Frequenz=245Hz
'Fast PWM = 0-255
Config Timer0 = Pwm , Prescale = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
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 C
      If C = 245 Then                   'Überläufe zählen (245)
         C = 0                          'Zähler zurücksetzen
         Toggle Gruen                   'LED toggeln
      End If
      Ldr = Getadc(2)
      If Ldr < 500 Then
         Config Timer0 = Pwm , Prescale = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
      Else
         Config Timer0 = Pwm , Prescale = 8 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect
      End If
   End If
Loop
End
 
Ist mir jetzt aufgefallen, es feklte noch
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
geht aber auch nicht, weder Single noch Free.
 
Die ISR fehlt auch noch.
Warum hast du es wieder "destrukturiert"?
 
#471 Zeile 41hab ich den Wert auf 10 runter gesetzt, ist auch nicht normal. LDR einmal an Vcc und mit 10k auf GND. Muss ein anderer Widerstand rein?:help2:
 
Hmm, eigentlich müsste der Mega8 Code (also der strukturierte) so funktionieren (klar, Timer1 auf 0 geändert etc).
Einen Fehler sehe ich jetzt nicht, vorausgesetzt DDRb ist richtig. Aber ich kann auch grade nur bei der Syntax und beim Lernen dieser helfen, mangels Hardware. Und Bascom will bei mir ja auch nicht. :/
 
Ich habe zwei Codes einmal mit Interrupt der nicht funktioniert


CodeBox BascomAVR
$regfile = "attiny13a.dat"              'Controllerdefinitionsdatei einbinden
$crystal = 1000000                      'Systemtakt angeben (Baudrate)
$hwstack = 32                           'Stacks
$swstack = 10
$framesize = 10
Dim C As Byte
Dim Fla As Byte
Dim Pause As Byte
Dim Pausex2 As Byte
Dim Tov0cnt As Byte
Dim Ldr As Word
Ddrb = &B10_1111
Portb = &B00_0000
Gruen Alias Portb.3
'Phasenkorrekter 8-Bit-PWM = 0-255 und 255-0 = 510, PWM-Frequenz=245Hz
'Fast PWM = 0.255
Config Timer0 = Pwm , Prescale = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Adc = Free , Prescaler = Auto , Reference = Avcc
On Timer0 Ontimer1overflow
Enable Timer0
On Adc Onadc
Enable Adc
Enable Int0
Enable Interrupts
Main:
   Goto Main
   'If Tifr0.tov0 = 1 Then               'wenn Timer übergelaufen ist
Ontimer1overflow:
   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 C
   If C = 245 Then                   'Überläufe zählen (245)
      C = 0                             'Zähler zurücksetzen
      Toggle Gruen                      'LED toggeln
   End If
Return
Onadc:
   Ldr = Getadc(2)
   If Ldr < 100 Then
      Config Timer0 = Pwm , Prescale = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
   Else
      Config Timer0 = Pwm , Prescale = 8 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect
   End If
Return
und der andere ohne Interrupt funktioniert.

CodeBox BascomAVR
$regfile = "attiny13a.dat"              'Controllerdefinitionsdatei einbinden
$crystal = 1000000                      'Systemtakt angeben (Baudrate)
$hwstack = 32                           'Stacks
$swstack = 10
$framesize = 10
Dim C As Byte
Dim Fla As Byte
Dim Pause As Byte
Dim Pausex2 As Byte
Dim Tov0cnt As Byte
Dim Ldr As Word
Ddrb = &B10_1111
Portb = &B00_0000
Gruen Alias Portb.3
'Phasenkorrekter 8-Bit-PWM = 0-255 und 255-0 = 510, PWM-Frequenz=245Hz
'Fast PWM = 0-255
Config Timer0 = Pwm , Prescale = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Adc = Free , Prescaler = Auto , Reference = Avcc
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 C
      If C = 245 Then                   'Überläufe zählen (245)
         C = 0                          'Zähler zurücksetzen
         Toggle Gruen                   'LED toggeln
      End If
      Ldr = Getadc(2)
      If Ldr < 100 Then
         Config Timer0 = Pwm , Prescale = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
         'Config Timer0 = Pwm , Prescale = 8 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect
      Else
         Config Timer0 = Pwm , Prescale = 8 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect
         'Config Timer0 = Pwm , Prescale = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
      End If
   End If
Loop
End
 
Blöde Frage:
Abblock Kondensatoren hast du dran?

Hintergrund-Info:
Ich selbst hatte mal einen Mega48 und einen Code der per Polling 1a funktionierte, nach Umstellung auf Interrupts nicht mehr. Der Code war so in Ordnung, gelegentlich lief er auch ein paar Sekunden fehlerfrei, dann Reset aus heiterem Himmel. Die Betriebsspannung am IC war zu instabil.
 
Welche Bascomversion hast Du denn versucht zu installieren? Ich nehme an Windows 10. Bei Linux weiß ich es nicht.
Ich habe damals noch unter Windows 7 Version 2.0.7.9 installiert und auch nach Windows update auf Windows 10 keine Probleme.
 

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