Welche Platine benutzt Du denn?
Druckbare Version
Welche Platine benutzt Du denn?
rnbfra 1.1 mit atmega 32 von robotikhardware.de.
Mir ist aber noch was komisches aufgefallen: Wie gesagt minicom funktioniert, wenn ich RX mit TX verbinde. Wenn ich den Stecker an meinen Controller anschließe kommen nur kryptische Zeichen zurück wenn ich was hinsende, dh. manchmal sind es komische Zeichen, manchmal aber auch das richtige Zeichen. Eigentlich sollte doch er doch auf das Senden von Zeichen überhaupt nicht reagieren oder? Das verstehe ich nicht!
Hast Du die Baudrate am µC auch richtig eingestellt ?Zitat:
manchmal sind es komische Zeichen
Komische Zeichen haben meistens was mit der falsch eingestellten Baudrate zutun.
Hast Du ein Quarz dran oder nur den internen Takt?
Beim internen Takt klappt es eventuell auch nicht immer...
Gruß Sebastian
Also die Baudrate ist im Programm-Code festgelegt. Hier nochmal der Code zur Erinnerung:
Mit Quarzen kenn ich mich überhaupt nicht aus. Ich nehm aber mal an, dass es dieses silberne kleine Kästchen direkt neben dem Prozessor ist, da neben dem CoController auch nochmal sowas ist. (kling logisch, ein Quarz für jeden Prozessor) Mal abgesehen davon steht auf dem neben dem MainController 8.000 Mhz, auf dem anderen 4.000 Mhz.Code:#include <avr/io.h>
#include <avr/sfr_defs.h>
//Einige Makros zur Berechnung des Baud-Raten Registers
#define F_CPU 8000000 // 8MHz Taktfrequenz
#define BAUD_RATE 9600 // gewünschte Baud-Rate für UART
#define BAUD_SELECT (F_CPU/(BAUD_RATE*16l)-1) //Berechnungsformel für das Baud-Raten Register
//Diese Funktion sendet ein einzelnes Zeichen an die UART
void uart_putchar(char c)
{
//warte, bis das Bit UDRE im Register UCSRA gesetzt ist.
//Dieses Bit wird vom Prozessor gesetzt, wenn das Senderegister leer ist
loop_until_bit_is_set(UCSRA, UDRE);
//Übergebenes Zeichen ins Senderegister UDR legen.
//Die Daten werden jetzt an die UART geschickt.
UDR = c;
}
int main (void)
{
//Zuerst muss die UART initialisiert werden
//Hier wird der Sender der UART aktiviert.
//Der Empfänger und die Interrupts bleiben in diesem Beispiel aus
UCSRB = 0x08;
//Jetzt muss noch die Baudrate eingestellt werden.
//Wir weisen dem Register einfach das Makro von oben zu.
UBRRL = BAUD_SELECT;
//Jetzt kommt die Hauptschleife
//Es wird immer das gleiche Zeichen (x) an die UART ausgegeben
while(1)
{
uart_putchar('x');
}
return 1;
}
mfg
jagdfalke
Auf das Senden von Zeichen sollte er in der Tat nicht reagieren, das hört sich etwas seltsam an. Du hast nicht zufällig ein Oszilloskop zur Verfügung? :)
Ich tippe aber auch mal auf eine nicht richtig eingestellte Baudrate.
Hast Du die Fuses auf den externen Quarz eingestellt?
askazo
Bitte was? Fuses? Ich war froh, dass ich in Bascom nie Fusebits einstellen musste. Keine Ahnung wie ich das mit Linux und C mache :S
Ich hab hier so ein script:
hilft das irgendwie?Code:#!/bin/sh
prg="adude"
#
help()
{
echo "prg_fusebit_uc -- read and write fuse bits of the atmega8"
echo ""
echo "Usage: prg_fusebit_uc [-hu] -r|-w Freq"
echo ""
echo "OPTIONS: -h this help"
echo " -r read fuse bytes"
echo " -u use uisp instead of avrdude"
echo " avrdude can automatically detect dapa or avrusb500."
echo " uisp can only be used with the parallel port dapa."
echo " -w write fuse bytes such that a given Freq is used"
echo " a frequency of 0 means external crystal. Possible"
echo " values are 0,1,2,4,8"
echo ""
echo "EXAMPLE: program the fuses to 4MHz internal"
echo " prg_fusebit_uc -w 4"
echo ""
echo "Warning: you can not undo the setting \"external crystal\" unless"
echo " you have a crystal that works."
echo "This script can be easily adapted to different programmer types"
exit 0
}
while [ -n "$1" ]; do
case $1 in
-h) help;shift 1;;
-u) prg="uisp";shift 1;;
-r) opt_r="1";shift 1;;
-w) opt_w="1";freq="$2";shift 2;;
-*) echo "error: no such option $1. -h for help";exit 1;;
*) break;;
esac
done
if [ -z "$opt_r" -a -z "$opt_w" ];then
# one of those options is mandatory
help
fi
hf=0xd9
if [ "$opt_w" = "1" ]; then
case $freq in
0) lf=0xee;echo "Make sure you have a crystal otherwise you can not change this!";sleep 2;;
1) lf=0xe1;;
2) lf=0xe2;;
4) lf=0xe3;;
8) lf=0xe4;;
*) echo "error: no such frequency, -h for help";exit 1;;
esac
fi
if [ "$prg" = "uisp" ]; then
if [ "$opt_r" = "1" ];then
set -x
uisp -dlpt=/dev/parport0 -dprog=dapa --rd_fuses
set +x
echo "Explanation: Fuse Low Byte: 0xe1 (1MHz intern), 0xe3 (4MHz intern), "
echo " 0xe4 (8MHz intern)"
echo " Fuse High Byte should be 0xd9"
exit 0
fi
if [ "$opt_w" = "1" ]; then
set -x
uisp -dlpt=/dev/parport0 -dprog=dapa --wr_fuse_l=$lf
uisp -dlpt=/dev/parport0 -dprog=dapa --wr_fuse_h=$hf
set +x
exit 0
fi
fi
if [ "$prg" = "adude" ]; then
if grep "Vendor=0403 ProdID=6001" /proc/bus/usb/devices > /dev/null ; then
prg="avrusb500"
else
prg="dapa"
fi
if [ "$opt_r" = "1" ];then
set -x
avrdude -p m8 -c $prg -v -q
set +x
echo "Explanation: Fuse Low Byte: 0xe1 (1MHz intern), 0xe3 (4MHz intern), "
echo " 0xe4 (8MHz intern)"
echo " Fuse High Byte should be 0xd9"
exit 0
fi
if [ "$opt_w" = "1" ]; then
set -x
avrdude -p m8 -c $prg -u -v -U lfuse:w:$lf:m
avrdude -p m8 -c $prg -u -v -U hfuse:w:$hf:m
set +x
exit 0
fi
fi
So kommen wir nicht weiter.....
Unter Windows ist das Board richtig gelaufen?
Hast Du mit Bascom programmiert ?
Hast Du irgendwie eine hex Datei, die 100 % geht ?
Z.B. irgendwas, was Du mit Bascom erstellt hast ?
mach die mal rein und guck, ob es klappt,
wenn nicht kann ich Dir was posten, dann versuchst Du es damit.
naja und nochwas hast Du RX vom PC mit TX und TX vom PC mit RX vom µC verbunden, aber wenn es unter Windows geklappt hat, wird es wohl so sein...
Gruß Sebastian
Ja Kabel ist richtig verbunden. Ich leider keinerlei überbleibsel aus der Bascom-Zeit (liegt schon ziemlich lange zurück). Wäre nett, wenn du mir was posten könntest.
Hallo ich habe eine eine Datei angehängt, entferne das .txt, dann kannst Du sie normal "enttaren".
Das muß klappen, habe gerade auf meinem STK500 ausprobiert...
EDIT:
UPS, Du hast doch Mega32 , oder ?
Wenn ja editiere Makefile und ersetze
MCU = atmega16
in
MCU = atmega32
danach nochmal make :oops:
Ich hatte keinen Mega32 zur Hand, sondern einen 16 deswegen...
Danke für die Mühe, es hat aber leider zu nichts geführt. Sobald RX und TX vom PC an TX und RX vom Controller hängen bekomm ich auf Tastenanschläge ein falsches Echo.
:(