Gast
#182729
Hi, ich arbeite an ein gerät das eine ROM Karte ausliest (512 kb). Das auslesen funktioniert anscheinend ohne probleme, nur das UART muckt rum ;) Ich benutze das usb dev board aus dem shop hier, d.h. mein AVR läuft auf 10 mhz und zur Übertragung benutze ich den USB<->rs232 konverter FT232BM. Also Übertragungsgeschwindigkeit habe ich 312500 baud gewählt (das ergibt sich aus der Mhz-taktung des AVRs) weil... 1 = 10000000 / (a*16) - 1 a = 312500 Baud Das übertragen funktioniert auch sehr flott, allerdings ist die Datei nicht 100%ig korrekt (zum größten teil sieht alles ok und richtig aus) und das geht beim Auslesen von Programmcode natürlich gar nicht das da fehler drin sind! Anstatt 512kb (524288 byte) zu lesen, werden 525899 byte gelesen (513kb)... noch schlimmer wird es wenn ich die Geschwindigkeit runter schraube, da kommen bei 15625 baud nur noch 277kb beim PC an :( Hier ist der source code meiner momentanen firmware mit reichlich kommentaren damit ihr wisst was ich da eigentlich machen will: #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <stdint.h> //#define UART_BAUD_CALC(UART_BAUD_RATE) ((F_CPU)/((UART_BAUD_RATE)*16L)-1) #define N_PROG 0x80 #define HADR 0x20 #define LADR 0x10 #define OUTPUT_ENABLE 0x4 #define LED_GREEN (1<<2) #define LED_RED (1<<3) //#define BAUDRATE 9600 void uart_send(unsigned char c); int main(void) { //port A als eingang (active high) DDRA = 0x00; PORTA = 0x00; //port B und C sind ausgänge zur Speicherkarte //port D wird nur für status LEDs benutzt DDRB = 0xFF; DDRC = 0xFF; DDRD = 0xFF; //"power on" LED ein PORTD = (~LED_GREEN); //UART setup //Interrupt bei Daten-Empfang //Empfang (RX) und Senden (TX) aktivieren UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); UCSRC = (1<<URSEL)|(3<<UCSZ0); //Asynchron 8N1 (8 bit, 1 stop bit) //UBRRH=(uint8_t)(UART_BAUD_CALC(BAUDRATE)>>8); //UBRRL=(uint8_t)UART_BAUD_CALC(BAUDRATE); UBRRH = 0; UBRRL = 1; //1 = 10000000 / (a*16) - 1 //a = 312500 Baud //Interrupts aktivieren sei(); //wie geht man in den sleep mode? while(1); } //ISR für USART receive SIGNAL(SIG_USART_RECV) { uint32_t addr; uint8_t addh; // Command-Byte überprüfen if(UDR == 0x10) { //voller ROM dump wurde angefordert //LEDs ein schalten PORTD = (~LED_GREEN) & (~LED_RED); //524288b / 1024 = 512kb auslesen for(addr=0;addr<524288;addr++) { //erster Teil der addresse (high part der Addresse) PORTB = (addr >> 10) & 0xFF; addh = (addr >> 18) & 0x3; PORTC = addh | N_PROG; PORTC = addh | N_PROG | HADR; PORTC = addh | N_PROG; //zweiter Teil der addresse (low part der Addresse) PORTB = addr & 0xFF; addh = (addr >> 8) & 0x3; PORTC = addh | N_PROG; PORTC = addh | N_PROG | LADR; PORTC = addh | N_PROG; //Ausgabe aktivieren PORTC = addh | N_PROG | OUTPUT_ENABLE; //Ergebnis von Port A per UART an PC senden uart_send(PINA); } //Grüne LED aus schalten PORTD = (~LED_GREEN); } } //Sendefunktion void uart_send(unsigned char c) { while (!(UCSRA & (1<<UDRE))); // warten bis Senden moeglich UDR = c; // sende Zeichen } Nur zur Info für alle die es vlt interessiert: Bei der Speicherkarte handelt es sich um ein Mask-ROM mit einen multiplexed address bus. Diese Karte stammt von einem elektronik spielzeug von Nintendo (Pokemon Mini heißt das ding und die Produktion ist mitlerweile eingestellt) - mehr infos gibt es auf unserer website http://pokeme.shizzle.it/ werbung mach ;D Vielen Dank für eure Hilfe! Mfg, Marius Als Dateianhang noch das Programm was ich auf der PC seite verwendet habe (VB 6.0), es kann gut sein das dort der Fehler liegt...