Was stimmt am Programm nicht?

Fragen zu Schaltungen, Elektronik, Elektrik usw.

Moderator: T.Hoffmann

Antworten
Marvin
Mega-User
Mega-User
Beiträge: 122
Registriert: So, 04.01.09, 13:05
Wohnort: Baden-Württemberg

Di, 22.06.10, 19:07

Hallo leute hab ein riesen problem mit einem Programm, dass ich geschrieben hab aber nicht funktioniert. Verwendet wird ein atmega8, Programm ist in basic und bascom geschrieben. Ich weiss dass es effektifere möglichkeiten gibt pausen zu gestalten und die pins zu deklarieren, es ist aber ein 5min projekt, das jezt leider von enormer wichtigkeit ist und ich ich wollte nicht nochmal nachlesen. Also keine verbesserungsvorschläge wie mans viel besser schreiben könnte sonder den fehler worans liegt brauch ich.

Code: Alles auswählen

$regfile = "m8def.dat"

$crystal = 1000000

Config Pinc.5 = Output
Config Pinc.4 = Output
Config Pinc.3 = Output
Config Pinc.2 = Output

Config Pinb.4 = Output
Config Pinb.3 = Output
Config Pinb.2 = Output
Config Pinb.1 = Output

Config Pind.2 = Input

Servo1 Alias Portc.5
Servo2 Alias Portc.4
Servo3 Alias Portc.3
Servo4 Alias Portc.2

Gruen1 Alias Portb.1
Gruen2 Alias Portb.3

Rot1 Alias Portb.2
Rot2 Alias Portb.4

Taster Alias Pind.2

Do

If Taster = 1 Then
Servo1 = 1
Servo2 = 1
Servo3 = 1
Servo4 = 1
Waitms 500
Servo1 = 0
Servo2 = 0
Servo3 = 0
Servo4 = 0
End If

Gruen1 = 1
Gruen2 = 1
Waitms 1000
Gruen1 = 0
Gruen2 = 0
Waitms 1000

Loop
ursprünglich war die if funktion ein interrupt, aber als diese nicht fuinktioniert hab hab ich alles kompliziertw rausgenommen und durch das einfachste ersezt. daes aber jezt immer noch nicht funktioniert weiß ich nicht mehr weiter. wenn ich das programm so auf den controller übertrag, blinken die 2 grüne leds 4 mal nacheinander dann die 4 servo leds 3sek, die 2grüne 1mal´, danach die servoleds nochmal und dann die grüne widaer 4mal

ich bitte um eure Hilfe! es ist wirklich wichtig für mich!!

mfG-. Marv
Benutzeravatar
CRI 93+ / Ra 93+
Auserwählter
Auserwählter
Beiträge: 2801
Registriert: So, 19.10.08, 23:56
Wohnort: Hannover

Di, 22.06.10, 19:59

Ich kenne BASCOM nicht, aber

PINx und Output passt nicht zusammen!

In C (CodeVisison) wäre es für PIN/PORT C0 so zu schreiben:

DDRC.5 = 1; // set data direction to output
PORTC.5 = 1; // set output to high

mit PINC.5 kann man den den Pin als Eingang abfragen, wobei DDRC.5 dann auf 0 sein sollte, sonst liest man immer den Zustand, den der Controller vorgibt, bzw. wenn z.B. ein Taster Angeschlossen ist, kommt es ggf. zu einem Kurzschluss. PORTC.5 lässt sich auch auslesen, enthält aber NICHT den von außen vorgegebenen Zustand des Pins, sondern immer nur das, was man vorher dort reingeschrieben hat.
[EDIT]
Ergänzung: wenn DDRn auf EINGANG eingestellt ist und man auf PORTn schreibt, so aktiviert man damit den zugehörigen internen Pull-Up-Widerstand (der liegt im Bereich 20 bis 50 kOhm, ein On-Die-Widerstand lässt sich offenbar nicht sehr präzise herstellen).
Dadurch kann man dann z.B. einfach einen Taster gegen GND anschließen ohne noch einen Pullup-Widerstand einbauen zu müssen. Der ATXMega hat übrigens noch zusätzliche Pull-Down-Widerstände.
[/EDIT]

DDR ist das data direction register
PORT ist das Ausgangsregister
PIN ist das Eingangsregister
Zuletzt geändert von CRI 93+ / Ra 93+ am Mi, 23.06.10, 19:18, insgesamt 1-mal geändert.
Borax
Star-Admin
Star-Admin
Beiträge: 11980
Registriert: Mo, 10.09.07, 16:28

Di, 22.06.10, 20:25

Eigentlich hat ja CRI 93+ / Ra 93+ schon alles gesagt...
Also anstatt Config Pinc.5 = Output einfach Config PORTC.5 = Output
Das ist auch immer eindeutig. Beim input ist es ggf. ein wenig 'schwieriger', Config Pind.2 = Input ist auf alle Fälle falsch das muss Config PORTD.2 = Input heißen, aber falls Du den internen Pull-Up verwenden willst muss dann noch ein Set PORTD.2 dazu damit der interne Pull-Up auch aktiviert wird. Die Aliases müssten passen (auch der 'Taster Alias Pind.2')
So wie die Abfrage aussieht: If Taster = 1 Then verwendest Du eher keinen pull up.
Marvin
Mega-User
Mega-User
Beiträge: 122
Registriert: So, 04.01.09, 13:05
Wohnort: Baden-Württemberg

Mi, 23.06.10, 16:51

also ich hab mir des programmieren selbst beigebracht unteranderem mit diesen Tutorials viewtopic.php?t=1599&start=0#p26077 ich programmier schon fast 1 jahr damit und es hat immer funktioniert. Daran kanns also nicht liegen. hat sonst noch jemand einen idee??
Benutzeravatar
CRI 93+ / Ra 93+
Auserwählter
Auserwählter
Beiträge: 2801
Registriert: So, 19.10.08, 23:56
Wohnort: Hannover

Mi, 23.06.10, 19:34

Vielleicht hattest Du bisher immer irgendwelche CMOS-Bausteine (= sehr hochohmige Eingänge) benutzt, so dass aktivierte Pullup-Widerstände als High-Signal ausgereicht haben...? (der Logikt der Registernamen und der Konfiguration am Anfang Deines Programms folgend, Schaltet Dein Hauptprogramm die Pullup-Widerstände ein und aus, gibt +Ub also nur über ca. 20..50 kOhm an den Ausgang)

Nach den Registerbezeichnungen im Atmel-Datenblatt wäre oben bei der Konfiguration dies korrekt:

Code: Alles auswählen

Config Ddrc.5 = Output
und die Konfiguration aus Deinem Source falsch/unsinnig: (Pinc.5 kann nur gelesen, nicht geschrieben werden)

Code: Alles auswählen

Config Pinc.5 = Output
Ob es da bei BASCOM irgendwelche obskuren Sonderregeln gibt, weiß ich nicht, aber in C würde man die Datenrichtung NICHT mit PIN, sondern mir DDR festlegen!

Versuchen, das zu ändern wirst Du doch bestimmt mal riskieren können...?
Benutzeravatar
CRI 93+ / Ra 93+
Auserwählter
Auserwählter
Beiträge: 2801
Registriert: So, 19.10.08, 23:56
Wohnort: Hannover

Mi, 23.06.10, 19:44

Dem Tutorial ist tatsächlich zu entnehmen, dass "Pinc.5 = Output" korrekt ist --- und das *IST* es auch, siehe hier im Roboternetz....
Offensichtlich hält sich BASCOM nicht an die von Atmel vorgesehenen Registerbezeichnungen.

BTW: welcher Controller ist es denn überhaupt?
Beim ATMega 164/324/644 z.B. (und auch anderen) muss man z.B. den JTAG-Port per Fuse-Bits (geht aber auch per Firmware) erst noch deaktivieren, falls man dessen Pins als normale IO-Ports nutzen möchte.
dussel
Mini-User
Beiträge: 7
Registriert: Sa, 17.05.08, 10:15

Mi, 23.06.10, 23:01

Ich würde auch schreiben:

config portb.1 = Output
config pinc.1 = Input
pinc.1 = 1' Pullup einschalten???

Schätze es liegt am Pegel vom Taster
Marvin
Mega-User
Mega-User
Beiträge: 122
Registriert: So, 04.01.09, 13:05
Wohnort: Baden-Württemberg

Do, 24.06.10, 11:57

ok leute danke schonmal bis hierhin. gerade hat sich herausgestellt, dass der mega8 kaputt ist, da er nichmal auf programmboard was macht^^. Hab jezt die schaltung mit ner 20 pol fassung bestückt und will ein 2313 verwenden. ABER: Es funktioniert schon wieder nicht un diesesmal kann es nicht am controller liegen, der ist nämlich neu.Hier der Code: Die if funktion funktioniert, ich kann auch die dou- Leds ansteuern GruenX/RotX, die servo leds bleiben in der funktion aber aus woran liegt das??

Code: Alles auswählen

'AVR Programm für den Servo roboter im Rahmen der FÜK Geschichte/Technik



$regfile = "2313def.dat"

$crystal = 1000000

Config Pind.2 = Input                                       '

Config Pinb.7 = Output                                      '
Config Pinb.6 = Output
Config Pinb.5 = Output
Config Pinb.4 = Output

Config Pinb.2 = Output                                     
Config Pinb.1 = Output
Config Pinb.0 = Output
Config Pind.6 = Output

Servo1 Alias Portb.7                                       
Servo2 Alias Portb.6
Servo3 Alias Portb.5
Servo4 Alias Portb.4

Gruen1 Alias Portd.6
Gruen2 Alias Portb.1
Rot1 Alias Portb.0
Rot2 Alias Portb.2

Taster Alias Pind.2                                       

Do

If Taster = 1 Then
Rot1 = 1
Rot2 = 1

Servo1 = 1
Servo2 = 1
Servo3 = 1
Servo4 = 1
Waitms 5000
Servo1 = 0
Servo2 = 0
Servo3 = 0
Servo4 = 0
Waitms 5000

Rot1 = 0
Rot2 = 0
End If

Gruen1 = 1
Gruen2 = 1
Waitms 500
Gruen1 = 0
Gruen2 = 0
Waitms 500

Loop


Servo1 = 1
Servo2 = 1
Servo3 = 1
Servo4 = 1
Waitms 5000
Servo1 = 0
Servo2 = 0
Servo3 = 0
Servo4 = 0
Waitms 5000

danke für eure hilfe>!!
dussel
Mini-User
Beiträge: 7
Registriert: Sa, 17.05.08, 10:15

Fr, 25.06.10, 17:58

Ich meine Bascom hat auch eine Servofunktion die man mit ServoX ansteuert.
Benenne die Servos doch mal um - - - - in StellmotorX
Jogi864
Mini-User
Beiträge: 1
Registriert: Sa, 31.07.10, 11:33

Sa, 31.07.10, 12:04

Hallo Marvin,

na, Dein Programm arbeitet zwischen DO und LOOP.
Warum sollte es zur Anweisung Servo1 = 1 kommen?
Beim erreichen von LOOP springt es automatisch nach DO zurück.
Antworten