Witam.
Od dłuższego czasu "walczę" z przerwaniem, które nie chce się za nic wykonać. Zrobiłem już wszystko co potrafiłem, ale niestety brak reakcji.
Chodzi tu o układ z obsługą dysku twardego, który połączony jest z komputerem za pomocą MAX232 (RS-232). Procesor to Atmega32 z wewnętrznym oscylatorem 8MHz.
Pętla "echo" działa. Dane wracają.
Może ktoś bardziej obeznany mógłby powiedzieć co jest nie tak? (W AVR-GCC jestem początkujący).
Załączam kod: (To jest wersja testowa - jak zacznie działać to zrobię "porządek". Wyciąłem to co nie potrzebne.)
Dziękuję za pomoc i za chęci również
Od dłuższego czasu "walczę" z przerwaniem, które nie chce się za nic wykonać. Zrobiłem już wszystko co potrafiłem, ale niestety brak reakcji.
Chodzi tu o układ z obsługą dysku twardego, który połączony jest z komputerem za pomocą MAX232 (RS-232). Procesor to Atmega32 z wewnętrznym oscylatorem 8MHz.
Pętla "echo" działa. Dane wracają.
Może ktoś bardziej obeznany mógłby powiedzieć co jest nie tak? (W AVR-GCC jestem początkujący).
Załączam kod: (To jest wersja testowa - jak zacznie działać to zrobię "porządek". Wyciąłem to co nie potrzebne.)
#include <avr/io.h>
#include <string.h>
#include <stdio.h>
#include "fat.h"
#include "ata.h"
#include "fattime.h"
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
void mcuInit (void);
void dir_serial (unsigned long cluster);
void print_hd_info (void);
int uart_putc (char c);
int uart_getc (void);
unsigned char odebrano=0;
unsigned char bufor[32];
TFILE *farq;
struct direntry *de;
char path[12];
int ok; //Flaga - zezwolenie na odczyt z dysku
char d;
unsigned char c;
ISR(SIG_UART_RECV)
{
c = UDR;
printf_P(PSTR("int")); // To się nie wyświetla
UARTReceiveString();
}
void UARTReceiveString(void)
{
unsigned char i=0;
do
{
if ((bufor[i] = c) == '\n') ReadHDD(); printf_P(PSTR("WORK")); break; //dodaje odebrane znaki do tablicy, jesli odbierze '\n' to przerywa petle, wychodzi z funkcji i uruchamia odczyt pliku.
i++;
}while (i < 32); // zeby nie przepelnic bufora
}
void ReadHDD(void)
{
if (ok) {
if (farq = fatFopen(bufor)) {
printf_P(PSTR("\r\nReading file...\r\n"));
while(!fatFeof(farq))
{
printf_P(PSTR("%c"), fatFgetc(farq));
}
fatFclose(farq);
} else { printf_P(PSTR("Nie mozna otworzyc")); }
} else {
printf_P(PSTR("ok=0 - nie mozna"));
}
}
int main(void)
{
// UART SET
UCSRA=0x02;
UBRRL = 0x10; // ustawienie UBRRL
UBRRH = 0x00; // ustawienie UBRRH
UCSRC = (1<<URSEL)|(3<<UCSZ0);
UCSRB= (1 << RXCIE)|(1<< RXEN)|(1<<TXEN)|(0<<TXCIE);
//END
mcuInit(); // start ATMega32
fdevopen(uart_putc,uart_getc, 0); // configure printf to send data to serial port
sei(); // Zezwol na przerwania
ok=0;
printf_P(PSTR("ODCZYT PLIKOW\r\n"));
ataInit(); // Start ATA
fatInit(); // Start FAT
fatCddir("pliki");
printf_P(PSTR("PLIKI\r\n"));
dir_serial(fatGetCurDirCluster());
printf_P(PSTR("Podaj nazwe pliku (np. plik.txt) do odczytania\r\n"));
ok=1; // Flaga oznaczajaca gotowosc do odczytu pliku
while(1);
}
//Definicje wycięte, aby zoptymalizować długość posta.
//Definicja "print_serial()"
//Definicja "print_hd_info()"
//*
// Function: uart_putc
// Parameters: char to send
// Returns: 0
//
// Description: send a character to UART and return 0 for compatibility reasons
//*
int uart_putc(char d)
{
loop_until_bit_is_set(UCSRA, UDRE);
UDR = d;
return 0;
}
//*
// Function: uart_getc
// Parameters: none
// Returns: the character read from UART
//
// Description: get a character from UART and return it, return -1 if the UART
// was empty
//*
int uart_getc(void)
{
if (bit_is_set(UCSRA, RXC) == 0)
return -1;
return UDR;
}
//*
// Function: mcuInit
// Parameters: none
// Returns: none
//
// Description: Initialize the ATMega32
//*
void mcuInit(void)
{
// Input/Output Ports initialization
PORTA=0xFF;// Port A initialization
DDRA=0xDF;
PORTB=0x00;// Port B initialization
DDRB=0x00;
PORTC=0x00;// Port C initialization
DDRC=0xFF;
PORTD=0x00;// Port D initialization
DDRD=0x00;
}
Dziękuję za pomoc i za chęci również
