Archiv verlassen und diese Seite im Standarddesign anzeigen : Bascom Simulator
Hallo!
Ich baue gerade ein Modellboot und möchte dieses per Microcontroller steuern. Ich hab einen attiny13 mit bascom programmiert. Leider funktioniert das Servo, das ich damit ansteuern will damit nicht.
Das hat dazu geführt, daß ich den Simulator nutzen wollte. Ich lasse mir die Variable Servo(1) ausgeben. Diese ändere ich in einem Loop immer wieder, leider bleibt der Simulator immer im Loop stecken, was mich vermuten läßt, daß das dann auch das Problem beim Servoansteuern ist...
hier der Code
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 22
Config Servos = 1 , Servo1 = Portb.0 , Reload = 10
Config Portb.0 = Output
Disable Interrupts
Do
Servo(1) = 50
Waitms 2000
Servo(1) = 150
Waitms 4000
Loop
Allzu tief konnte ich bis jetzt noch nicht in die Materie eintauchen...
Vielleicht kann mir jemand helfen bzw. einen Tipp geben
lg
Wolfgang
Disable Interrupts
Damit die Servos funktionieren, wirst du die Interrupts global freigeben müssen. Die Routine verwendet die ISR von Timer0.
Mit Waitms 2000 wirst du im Simulator sehr lange (mehrere Minuten) warten müssen, bis sich da was tut. Entweder du gibst zum Testen kleinere Wartezeiten ein oder du schreibst am Anfang $sim in deinen Code. Dann werden die Wartezeiten ignoriert.
aha, jetzt gehts, aber ich dachte ms bedeutet millisekunden... Danke! disable interrupts habe ich mit enable interrupts ersetzt
Leider schaff ich es noch immer nicht den Servo alle paar Momente umzustellen... Vielleicht kannst du mir nochmal helfen?
Ich betreibe das Netzgerät mit 5V und hänge an Pin4 den Minuspol und an Pin8 den Pluspol. Pin 5 verbinde ich mit einer Litze mit dem orangenen Kabel des Servos. Das Servo selber schließe ich an 6 Volt an.
Habe ich da was falsch gemacht. Kann ich irgendwie überprüfen welcher Code sich im Speicher des Mikrocontroller befindet? Oder reicht es wenn keine Fehlermeldung kommt wenn ich den "Programm Chip" Button drücke?
Danke schon mal für die Hilfe...
Wolfgang
ja für den µC aber der rechner macht das nicht so schnell der brauch dafür ewig
und dann noch der tipp stell das bei bascom so ein das du den chip gleich danach ausliest und vergleichst wenn ein fehler aufgetaucht ist dan siehst den
oder drückst verify flash Rom against buffer
Hallo!
Ein Tipp:
Du mußt GND vom Servo mit GND vom µC verbinden.
MfG
Rone
Hallo!
Also auf dem Chip dürfte das Programm oben sein... Aber funktionieren tut das Werkl noch immer nicht.
@Rone: Das mit dem Verbinden der beiden Grounds verstehe ich nicht ganz, wenn ich zwei Spannungen habe. Dann habe ich zwei Spannungen die auf dem Ground zusammentreffen (Netzteil mit ca. 5 Volt und Servo mit 6 Volt) oder?
Kannst du mir vielleicht alle Verbindungen die ich machen muß aufschreiben, damit nichts kaputt mache. Ich habe davon null Ahnung...
lg
Wolfgang
GND müssen verbubnden sein sonst hast Du keinen
Sromkreis in der Ansteuerung. Du hast bei Dir 2 Sromkreise,
einmal 6V......Motor......GND,
einmal 5V.....Servoelecktronik....GND. Damit diese
Kreise gesclssen sind müssen beide GND verbunden sein,
sonst kann kein Steuerstrom ließen und es tut sich NIX.
Du brauchst ein gemeinsames Potential.
Gruß Richard
Hallo Richard!
Ich stell mich sicher sehr blöd an, aber ich bin ein absoluter Newbie...
Deshalb frage ich jetzt nochmal bevor ich was kaputt mache:
Beim Servo schließe ich einen Batteriehalter mit 6V bei Plus und Minus des Servos an (Servo macht einen Ruckler...)
Beim Mikrocontroller schließe ich plus bei Pin8 und minus bei Pin4 vom Netzgerät mit 5V an. Dann verbinde ich das orangene Kabel des Servos mit Pin5 des Mcontroller.
Und jetzt verbinde ich noch Pin4 (gnd Microc.) mit dem Minuspol des Servos??
lg
Wolfgang
Hm, geht noch immer nicht... Bei der Zeitsteuerung hab ich wieder 2000ms genommen... der Mikrocontroller hält sich ja an die Zeit, oder?? Hier nochmal der Code
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 22
Config Servos = 1 , Servo1 = Portb.0 , Reload = 10
Config Portb.0 = Output
Enable Interrupts
Do
Servo(1) = 50
Waitms 2000
Servo(1) = 150
Waitms 4000
Loop
Hast du da sicher nen 1,2 MHz-Quarz dran?
Laut myavr.de homepage hat er 20 MHZ - http://shop.myavr.de/Bauelemente%20und%20Controller/ATtiny13%20-%2020%20PU.htm?sp=article.sp.php&artID=200004 - hab das geändert - auch das hatte nicht den gewünschten Effekt...
$regfile = "attiny13.dat"
$crystal = 20000000
$hwstack = 22
Config Servos = 1 , Servo1 = Portb.0 , Reload = 10
Config Portb.0 = Output
Enable Interrupts
Do
Servo(1) = 50
Waitms 200
Servo(1) = 150
Waitms 400
Loop
Die Angabe heisst, dass er bis max. 20 MHz laufen kann; das aber nur, wenn auch ein entsprechender Quarz oder anderer Taktgeber dranhängt.
"Standardmässig" (Also im Auslieferungszustand) laufen die mit nem internen Taktgeber mit 1MHz.
Nur durch Ändern von $crystal ändert sich die echte Frequenz nicht. Da muss man in den Fuses rumwerkeln.
heißt das jetzt, daß ich mit dem microc allleine das servo nicht steuern kann auch nicht mit 1mhz? wenn ich einen quarz habe wie hänge ich den dran?
heißt das jetzt, daß ich mit dem microc allleine das servo nicht steuern kann auch nicht mit 1mhz? wenn ich einen quarz habe wie hänge ich den dran?
Doch, du kannst mit einem µC alleine einen Servo ansteuern. Wenn du einen Quarz verwenden willst, dann musst du diesen zwischen XTAL1 und XTAL2 mit jeweils 22pF Kondensatoren gegen Masse anschließen und die Fuses auf Externen Takt umstellen.
Grüße
Thomas
Ich komm damit einfach nicht weiter. Ich schicke ein Bild mit, das den Versuchsaufbau zeigt. Vielleicht kann mir dann jemand einen Tipp geben, was ich falsch mache...
Danke schon Mal!
http://www.4shared.com/file/181985184/58db6a4f/testaufbau.html
Hallo!
Attiny13 - 20PU sagt nur aus daß man den µC bis max. 20 MHz
takten kann.
Im Auslieferungszustand rennt der µC mit internem Oszillator und
aktiviertem CLOCKDIV 8. D.h. - 9,6MHz dividiert durch 8 ist 1,2MHz.
Naja, die 1,2MHz könnten ev. etwas wenig sein für den Servo-Befehl
(habs aber nicht getestet). Ich würde auf 9,6MHz umstellen.
Die Servo=50 ist ein bißchen wenig (10µs * 50 = 500µs)
Probiers mal mit Servo=100 und Servo=200 - sollten 1ms u. 2ms
entsprechen.
Wenn Du schon absoluter Newbie bist, würde ich mal eine Led blinken
lassen. Dann siehst Du wenigstens gleich, daß Du den µC richtig
geflasht hast, daß Du keine Kontaktprobleme hast, u.s.w.
Viel Erfolg
MfG
Rone
Hallo nochmal!
Also hab mich an die Anweisung für die Verdrahtung gehalten - aber der Servo "zuckt" nur sehr schnell.
Heißt das daß ich richtig verdrahtet habe und etwas in der Programmierung nicht stimmt - oder kann man das nicht so leicht sagen?? Bitte wenn geht so einfach wie möglich erklären!
mfg
Wolfgang
Ps:Die obligate Led zum Blickenbringen Übung hat funktioniert...
Was heisst den schnell zucken? Macht er das unkontrolliert oder erreicht er die gewünschte Position mit einem "Ruck"/"Sprung" etc.?
er macht gleichmäßig - äußerst schnell, kleine Bewegungen - nicht das, was ich programmiert habe nämlich nach 1000ms eine Bewegung und dann nach 1000ms in die andere Richtung
Hallo!
Hab mir mal das ganze Zeugs zusammengesucht und aufgebaut.
Eas soll ich sagen: Bei mir läufts wie geschmiert.
Servo Graupner C5007 (Standardservo)
Servo50 bis Servo200 ist bei mir von Anschlag zu Anschlag.
Wenn Du meine Tipps weiter oben befolgt hättest, würde es auch bei Dir
funktionieren.
Crystal 1200000 und Clockdiv gesetzt führen auch bei mir zu den
Servozuckungen.
Also noch einmal: crystal = 9600000 und Clockdiv wegnehmen und es läuft.
MfG
Rone
Hallo Rone!
Danke, daß du dir so viel Mühe gibst mir zu helfen. Wenn ich clockdiv abschalten will muß ich zu der Fusebits Ansicht oder und Fusebit E ändern oder? Leider änder bascom es nicht wenn ich dann auf writeFS drücke - nach einem Refresh ist alles wieder beim alten...
mfg
Ähm nochmal eine Frage - aber wieso kann man in Bascom die Fusebits nicht ändern - er schreibt zwar "write Fusebits" aber nichts passiert - nach einem Refresh ist alles beim Alten - ich hab schon im Bascom Forum gefragt und die meinten ich soll den chip reseten - muß ich da Vcc für eine kurze Zeit auf Pin 1 (beim Attiny13) legen??
Was für einen Programmer hast du denn? Meiner resettet automatisch, ist allerdings auch ein Eigenbau-Ding.
Grüße
Thomas
den myMultiProg MK2 USB von myavr.de
lg
den myMultiProg MK2 USB von myavr.de
Dann schau mal ins Datenblatt von dem Ding, da stehen alle benötigten Infos drin.
Grüße
Thomas
bevor ich irgendwas hin mache... dipschalter 4 kurz on/off schalten?? Das ist wahrscheinlich eine saublöde Frage, aber ich hab nichts anderes zum Thema reset gefunden, betrifft wahrscheinlich aber nur den Adapter...
Hallo!
Also ich hab mal Schaltplan und technische Beschreibung zu dem Ding gefunden:
Schaltplan (http://www.myavr.info/download/produkte/mymultiprog/techb_schaltplan_mymultiprog-mk2-usb.png) / Technische Beschreibung (http://www.myavr.info/download/produkte/mysmartusb_mk2/techb_mysmartusb-mk2_de_en.pdf)
Laut der Beschreibung machst du mit dem Umschalten des Dipschalters einen Hardware-Reset des Programmers. Allerdings hilft dir das nicht viel, du solltest ja deinen Ziel-Controller resetten. Dazu musst du den Reset-Pin deines Controllers gegen GND legen (am besten über einen Widerstand von 100R).
Abblockkondensatoren an der Zielschaltung sind vorhanden? Wie sieht denn deine Reset-Beschaltung aus?
Grüße
Thomas
Oh Mann - warum ist das alles so kompliziert - ich möcht doch bloß ein Servo für ein Modellschiff steuern - wenn das so weiter geht muß ich zuerst Ing für Elektrotechnik machen bis ich einen mcontroller reseten kann und ohne Studium wird sich der servo sowieso nicht bewegen...
Ich glaub ich brauch ein gutes Scriptum - bei mir haperts vorn und hinten - ich rede da von ganz anderen Sachen und mir ist es schon langsam sehr peinlich zu fragen... Aber ich möchte jetzt keinen Roboter bauen sondern nur das Servo steuern. Am liebsten wär mir wenn es mir jemand so erklärt:
Legst du zwischen Pin 1 und GndPIn widerstand von 100 ohm und minuspol von netzgerät auf gndpin. Pluspol auf Pin 8. Und was sind jetzt genau Abblockkondensatoren??
Gibt es auch irgendwo ein Forum wo man so dämliche Fragen stellen kann wie ich??
Hallo!
Nur nicht verzagen, wir haben alle mal so angefangen.
Also den Reset machst du, sowie du ihn beschrieben hast. Der Wert des Widerstandes ist nebensächlich, er sollte nur nicht allzugroß sein. Man könnte auch den Pin direkt auf Masse legen, nur irgendwie gefällt mir das nicht.
Abblockkondensatoren sind einfach nur kleine Keramikkondensatoren mit ungefähr 100nF Kapazität. Diese sollten an alle Versorgungsspannungsanschlüsse, also zwischen Vcc und GND, gesetzt werden. So ein Controller zieht nämlich während er arbeitet kurzzeitig immer wieder massenhaft Strom, welcher dann als Spannungseinbruch auf der Versorgungsleitung bemerkbar ist. Diesen Spannungseinbruch kann ein Entstör-, oder Abblockkondensator verhindern.
Grüße
Thomas
Hallo!
Lad Dir von myAVR das ProgTool 1.20 herunter.
Schau Dir das kleine Programm an.
Damit kannst Fusebits beschreiben, flashen, verfusten AVR
retten, und was weis ich sonst noch alles.
Ich flashe meine µC auch damit. Mit Bascom Hex-File erzeugen
und mit dem ProgTool flashen. Geht auch schneller damit,
weils nicht wie Bascom das EEprom mitbeschreibt.
MfG
Rone
Yes Sir! Das Servo macht das was ich will! Yesss!!! Danke Tom und Rone! Hab mir Prog Tool 1.2 heruntergeladen und mit dem gings jetzt tatsächlich das clockdiv aufzuheben. Bascom hat trotzdem noch immer nicht die gesetzten Fuses richtig angezeigt - warum auch immer. Ich weiß zwar nicht für was das clockdiv gut sein soll, aber was solls...
Danke nochmal für Eure Geduld und Hilfe!
lg
Wolfgang
Ich weiß zwar nicht für was das clockdiv gut sein soll, aber was solls...
Der dividiert die Taktfrequenz. Clock=Takt, Div=Divide=Dividieren
Grüße
Thomas
Ich hätte wieder mal eine Frage, weil wieder mal was nicht funktioniert... Ich möchte dem mcontroller eingaben geben und je nachdem eine Led schneller und langsamer blinken lassen.
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 22
Config Portb.0 = Output
Config Portb.1 = Input
Enable Interrupts
Do
If Portb.1 = 0 Then
Waitms 1000
Portb.0 = 1
Waitms 1000
Portb.0 = 0
End If
If Portb.1 = 1 Then
Portb.0 = 1
Waitms 200
Portb.0 = 0
Waitms 200
End If
Loop
End
Ich lege an Pin4 gnd und pin8 5v Spannung vom Netzgerät an. die Led geht von Pin5 nach gnd. Dann habe ich noch eine Ader von pin8 nach pin6 (portb.1) und mit einem widerstand von 1kohm nach gnd, die ich je nachdem öffne und schließe... Wahrscheinlich ist die schaltung blödsinn aber mir fällt es nicht besser ein. Kann mir da nochmal jemand helfen?
Vielen Dank
lg
Wolfgang
Hallo!
Was genau öffnest du? Wenn der Pin in der Luft hängt, also ohne irgendwas dran, dann fängt er sich Störungen ein und bleibt eventuell sogar auf high.
Besser wäre, du nimmst einen Draht von Portb.1 und legst diesen auf GND (ohne Widerstand). Dazu musst du dann aber den internen Pullup-Widerstand einschalten.
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 22
Config Portb.0 = Output
Config Pinb.1 = Input
Portb.1 = 1
Enable Interrupts
Do
If Portb.1 = 0 Then
Waitms 1000
Portb.0 = 1
Waitms 1000
Portb.0 = 0
End If
If Portb.1 = 1 Then
Portb.0 = 1
Waitms 200
Portb.0 = 0
Waitms 200
End If
Loop
End
Außerdem darfst du nicht Config Portb.1 = Input verwenden, sondern Config Pinb.1 = Input
Grüße
Thomas
Ich hab jetzt den Pullup widerstand mit Pinb.1 = 1 aktiviert und gnd mit pinb1 verbunden und wieder entfernt. Er reagiert auf die Veränderung macht aber nicht das was ich ihm ihm Programm sage. Beim lange Blinken macht er es länger und wenn er kurz blinken soll leuchtet die Diode die ganze Zeit.
Was ich nicht verstehe ist, warum man den Pin nur mit gnd verbinden muß, damit eine spannung anliegt... und was der Unterschied zwischen pinb.1 und Portb.1 ist...
lg
Wolfgang
Ich hab jetzt den Pullup widerstand mit Pinb.1 = 1 aktiviert und gnd mit pinb1 verbunden und wieder entfernt. Er reagiert auf die Veränderung macht aber nicht das was ich ihm ihm Programm sage. Beim lange Blinken macht er es länger und wenn er kurz blinken soll leuchtet die Diode die ganze Zeit.
Was ich nicht verstehe ist, warum man den Pin nur mit gnd verbinden muß, damit eine spannung anliegt... und was der Unterschied zwischen pinb.1 und Portb.1 ist...
Den Pullup Widerstand musst die mit Portb.1 = 1 einschalten. Nur die Deklaration als Eingang ist Pinb.1 = Input
Auf welcher Frequenz läuft der Controller?
Wenn der Pin nicht auf GND liegt, dann liegen +5V über den Pullup-Widerstand ständig am Pin an. Verbindest du den Pin nun mit GND liegen 0V am Pin an.
Grüße
Thomas
der controller läuft mit 1,2 Mhz. Heißt das, wenn ich den Pullup Widerstand einschalte, daß eine Verbindung von der Stromversorgung zum entsprechenden Pin hergestellt wird und daß deshalb die 5V anliegen? Und wenn ich den pin dann mit gnd verbinde der strom sich den Weg des geringsten Widerstands sucht und über diese ader abfließt? (anders kann ich mir es nicht erklären)
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 22
Config Portb.0 = Output
Config Pinb.1 = Input
Portb.1 = 1
Enable Interrupts
Do
While Pinb.1 = 0
Waitms 1000
Portb.0 = 1
Waitms 1000
Portb.0 = 0
Wend
While Pinb.1 = 1
Portb.0 = 1
Waitms 500
Pinb.0 = 0
Waitms 500
Wend
Loop
End
Statt dem schnelleren Blinken leuchtet die Diode die ganze Zeit...
lg
Wolfgang[/quote]
Hallo!
Du setzt in der zweiten Schleife den Pin mit Pinb.0=0 zurück. Du musst ihn aber mit Portb.0=0 zurücksetzen, genauso, wie du es in der oberen Schleife gemacht hast.
Grüße
Thomas
Ah danke! Im großen und ganzen funktionierts jetzt, aber irgendwie sehr ungenau. Er stellt sich auch manchmal um, obwohl ich gar nichts mache - und dann blinkt er oft noch ein paar mal weiter obwohl ich den Zustand an pin pb1 ändere...
Hallo!
Was ich nicht verstehe ist, warum man den Pin nur mit gnd verbinden muß, damit eine spannung anliegt... und was der Unterschied zwischen pinb.1 und Portb.1 ist...
Lies das mal durch. Die Assemblerteile kannst weglassen.
http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen
Noch eins: Das Datenblatt ist voll mit Erklärungen.
MfG
Rone
Ah danke! Im großen und ganzen funktionierts jetzt, aber irgendwie sehr ungenau. Er stellt sich auch manchmal um, obwohl ich gar nichts mache - und dann blinkt er oft noch ein paar mal weiter obwohl ich den Zustand an pin pb1 ändere...
Du darfst nicht erwarten, das der Controller wenn er den Befehl Waitms 1000 ausführt, diesen einfach unterbricht, nur weil du einen Zustand änderst. Zuerst wird alles in der Schleife ausgeführt, erst wenn der Controller wieder an dem Befehl zum Lesen des Eingangs vorbeikommt, liest er den Eingang ein. Ein Schleifendruchgang dauert bei dir sehr lange, da du den Controller immer wieder eine lange Zeit warten lässt.
Grüße
Thomas
aso - hab das ganze mit einem Servo probiert und das hat mal zur Abwechslung super geklappt...
der nächste Schritt wäre, daß ich mir zwei Funkmodule kaufe (ich mach das Ganze ja nur, damit ich mein Modellboot damit steuern kann). Hab mir schon einiges dazu durchgelesen. Nur, man bekommt keine Programmer dafür (nur von so einer schweizer Firma, bei der ich wahrscheinlich noch zoll zahlen muß). Möchte zwei easyradio 433 mhz transmitter kaufen... Bräuchte eine gute Seite, vielleicht sogar eine, die etwas ähnliches wie ich realisieren will...
@Rone: Ich versteh oft schon nicht, was ihr meints, wenn ihr mir auf Deutsch schreibt - wie soll ich dann das englische Datenblatt verstehen. Ich schaus mir bei meinen Versuchen eh immer wieder an, aber ich versteh halt kaum was davon - am besten wärs wahrscheinlich wenn ich einen Elektronik Grundkurs machen würde... Ich fühl mich eh blöd, wenn ich ständig fragen muß, aber ich glaub halt immer, daß das was ihr hier schreibts nicht nur mir sehr hilft, sondern in zukünftig noch anderen Anfängern...
lg
Wolfgang
Hab da nochmal eine Frage. Ich möchte das Servo jetzt noch über einen Spannungsinput steuern... Ich hab mir das so einfach vorgestellt - naja. Ich hab bei meinem Netzgerät zwei Ausgänge. Mit einem wollte ich den mcontroller versorgen mit dem anderen den adc eingang regeln. Ich hab die selbe "Schaltung" wie im Thread. Nur daß ich eben noch den Pluspol vom zweiten Netzgerätausgang auf den adc(1) Eingang gelegt und den Negativen auf gnd. Ich möchte mit dem drehknopf (wüßt ich nur die ganzen Fachbegriffe) des zweiten Ausgang eine Spannung zwischen 0 und 5v anlegen und der Servo sollte sich drehen... Es soll nur mal so ungefähr gehen, deswegen dividiere ich den wert 1024 bei 5V durch 6 und übergebe in ans servo- sollte sich ja dann zumindest bewegen... Her der code:
$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 22
Config Servos = 1 , Servo1 = Portb.4 , Reload = 10
Config Adc = Free , Prescaler = Auto
Config Portb.4 = Output
Start Adc
Enable Interrupts
Do
Servo(1) = Getadc(1) / 6
Loop
End
Hab mir diesen thread durchgelesen:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=38286[code]
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.