das der
UART nicht immer genau funktioniert liegt an den condensatoren am max, die teilweise zu grosse abweichung in der vorgeschriebenen toleranz haben.
welche Kondensatoren sollte man dann verwenden?
hier mein Code:
die Headerdatei:
Code:
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/twi.h>
#include <stdlib.h>
#include "TWI.h"
#include "uart.h"
#include "sram.h"
#define START_PORT PORTB
#define START_PIN 1
#define SIN_PORT PORTD
#define SIN_PIN 7
#define LOAD_PORT PORTD
#define LOAD_PIN 6
#define RESET_PORT PORTB
#define RESET_PIN 4
#define XCK_PORT PORTD
#define XCK_PIN 2
#define READ_PORT PIND
#define READ_PIN 3
void sei(void);
uint8_t ADC_read(uint8_t, uint8_t);
void ADC_print(uint8_t);
void gbcam_write(uint8_t, uint8_t);
void pos_imp(void);
void delay(uint8_t);
die Codedatei:
Code:
#include "gbcam.h"
uint8_t temp=0, counter;
int main(void)
{
/* Deaktivieren des JTAG-Interfaces */
MCUCSR = (1<<JTD);
MCUCSR = (1<<JTD);
/* Initialisieren des UART */
uart_init(UART_BAUD_SELECT(2400, 1000000));
/* Initialisieren des TWI */
TWI_init(0xFD);
/* Initialisieren von PortA */
DDRA = 0xFF;
PORTA = 0x0;
/* Initialisieren von PortB */
DDRB = 0xF;
DDRB |= 0x12;
/* Initialisieren von PortD */
DDRD |= 0xC4;
DDRD &= ~0x8;
PORTB |= (1<<WE);
/* Interrupts global aktivieren */
SREG |= 1<<7; //sei();
/* gbcam resetten */
RESET_PORT &= ~(1<<RESET_PIN);
XCK_PORT |= (1<<XCK_PIN);
RESET_PORT |= (1<<RESET_PIN);
XCK_PORT &= ~(1<<XCK_PIN);
/* gbcam-Register beschreiben */
gbcam_write(0x0, 0x80);
gbcam_write(0x1, 0x04);
gbcam_write(0x2, 0x00);
gbcam_write(0x3, 0x15);
gbcam_write(0x4, 0x01);
gbcam_write(0x5, 0x00);
gbcam_write(0x6, 0x01);
gbcam_write(0x7, 0x04);
/* Bild machen... */
START_PORT |= (1<<START_PIN);
pos_imp();
START_PORT &= ~(1<<START_PIN);
/* ...und warten, bis Bild fertig ist */
while(!(READ_PORT & (1<<READ_PIN)))
pos_imp();
/* ADC konfigurieren */
uint8_t u;
u = ADC_read(0x48, 0x41);
/* Pixelwerte lesen und in SRAM speichern */
uint16_t counter=0;
for(counter = 0; counter < 16384; counter++) {
pos_imp();
sram_write_byte(counter, TWI_readbyte());
}
/* TWI_Verbindung beenden */
TWI_stop();
/* Pixelwerte aus Speicher lesen und an PC senden */
for(counter = 0; counter < (16384); counter++) {
u = sram_read_byte((counter));
uart_putc(u);
}
while(1);
}
/* Funktion zum Initialisieren und Lesen des ADCs */
uint8_t ADC_read(uint8_t addresse, uint8_t control)
{
uint8_t temp;
TWI_start((addresse << 1) | SEND);
TWI_sendbyte(control);
TWI_start((addresse << 1) | READ);
temp = TWI_readbyte();
temp = TWI_readbyte();
return temp;
}
/* Funktion zum Beschreiben der Kameraregister */
void gbcam_write(uint8_t addr, uint8_t wert)
{
uint8_t temp;
for(temp=3; temp > 0; temp--) {
if((addr & (1<<(temp-1))) == (1<<(temp-1))) SIN_PORT |= (1<<SIN_PIN);
else SIN_PORT &= ~(1<<SIN_PIN);
pos_imp();
}
for(temp=8; temp > 1; temp--) {
if((wert & (1<<(temp-1))) == (1<<(temp-1))) SIN_PORT |= (1<<SIN_PIN);
else SIN_PORT &= ~(1<<SIN_PIN);
pos_imp();
}
if((wert & (1<<0)) == (1<<0)) SIN_PORT |= (1<<SIN_PIN);
else SIN_PORT &= ~(1<<SIN_PIN);
XCK_PORT |= (1<<XCK_PIN);
delay(3);
LOAD_PORT |= (1<<LOAD_PIN);
delay(3);
XCK_PORT &= ~(1<<XCK_PIN);
LOAD_PORT &= ~(1<<LOAD_PIN);
}
/* Erzeugen eines positiven Impulses am Taktpin */
void pos_imp(void)
{
XCK_PORT |= (1<<XCK_PIN);
delay(3);
XCK_PORT &= ~(1<<XCK_PIN);
}
/* Verzögerungsfunktion, Parameter bezieht sich nur auf Anzahl der auszuführenden nops */
void delay(uint8_t time)
{
uint8_t temp;
for(temp = 0; temp < (time + 1); temp++)
asm("nop");
}
ich verwende ziemlich oft kurze Pausen(->delay() ), ob man die aber benötigt, weiß ich nicht
Lesezeichen